我們知道Linux內(nèi)核使用交換空間而不是RAM內(nèi)存的時候會嚴(yán)重降低性能。那么,有人可能會問,既然我有足夠多的可用內(nèi)存,刪除交換空間不是更好嗎?
簡短的回答是不會。反而啟用交換空間會帶來性能優(yōu)勢。即使您的Linux服務(wù)器有足夠多的可用內(nèi)存,您也會經(jīng)常發(fā)現(xiàn)Linux服務(wù)器長時間運(yùn)行后會使用交換空間。
在本教程中,我們將說明為什么你應(yīng)該添加交換空間swap,使用swap交換空間的優(yōu)點(diǎn),在不使用交換空間時將有那些區(qū)別與缺點(diǎn)。
如何在內(nèi)存和交換空間使用上作出取舍,理解頻繁使用交換空間帶來的性能影響。
如何配置vfs_cache_pressure與swappiness值,應(yīng)優(yōu)先調(diào)整內(nèi)存回收速度,如何確定頻繁使用交換空間。
交換空間是否降低Linux性能
請查看以下數(shù)據(jù),該數(shù)據(jù)是從運(yùn)行一個月后的實(shí)時聊天服務(wù)器獲取的。以下數(shù)據(jù)來自free
命令的結(jié)果。
total used free shared buff/cache available
Mem: 3.7G 1.0G 445M 84M 2.2G 2.2G
Swap: 1.8G 308M 1.5G
free -h
這里的數(shù)據(jù)顯示使用了308M的交換空間。當(dāng)我運(yùn)行swapping檢查時,沒有跡象表明進(jìn)行或不合時宜使用交互空間I/O的活動。
除此之外kswap服務(wù)并沒有消耗太多CPU時間。使用top命令按CPU時間排序的查找頂級進(jìn)程中也找不到kswap進(jìn)程。
為了確認(rèn)kswap進(jìn)程是否繁忙。我們還使用了ps命令并通過grep過濾輸出來確認(rèn)。
所以在這種情況下,swap使用不會降低Linux服務(wù)器的性能。現(xiàn)在,讓我們看看交換空間實(shí)際上如何改善Linux服務(wù)器性能。
ps -A | grep kswap
40 ? 00:00:29 kswapd0
使用swap交換空間的優(yōu)點(diǎn)
Linux系統(tǒng)使用一些swap是正常的事,也是一件好事。Linux內(nèi)核會將幾乎從未使用過的內(nèi)存頁面移動到交換空間中,以確保內(nèi)存為更頻繁使用內(nèi)存頁面的進(jìn)程提供更多可用的緩存空間。
當(dāng)內(nèi)核被迫不斷地將內(nèi)存頁面移入和移出內(nèi)存和交換空間swap時,交換空間使用會成為一個性能問題。
另一個優(yōu)點(diǎn)是交換空間swap讓管理員有時間對低內(nèi)存問題做出反應(yīng)。我們經(jīng)常會注意到服務(wù)器運(yùn)行緩慢,并且在登錄時會注意到大量使用交換空間。如果沒有交換空間,內(nèi)存不足會產(chǎn)生更加突然和嚴(yán)重的連鎖反應(yīng)。
所以我們會建議將交換空間設(shè)置為您最大進(jìn)程的大小。比如mysql在my.cnf中配置的內(nèi)存。
有些人建議不要使用交換空間或交換空間大小略大于總內(nèi)存。如果您能為此提出正當(dāng)理由,那么這可能是您的選擇。
但是,這在服務(wù)器上幾乎不是這種情況,您應(yīng)該在交換空間對您的應(yīng)用程序的影響之間取得平衡。交換空間不會改變服務(wù)器所需的內(nèi)存總量。它旨在改善系統(tǒng)的性能。
總的來說,即使仍有足夠多可用的內(nèi)存RAM,Linux內(nèi)核也會將幾乎從未使用過的內(nèi)存頁面移動到交換空間。
換出一段時間不活動的內(nèi)存頁面,將經(jīng)常使用的數(shù)據(jù)保留在緩存中,這發(fā)生在服務(wù)器最空閑的時候。
這是Linux內(nèi)核該做的事。也避免將交換空間設(shè)置得過大,否則會導(dǎo)致性能問題、中斷或響應(yīng)時間加長。
交換空間與不使用交換空間區(qū)別
上面所說是你有足夠多可用內(nèi)存。但實(shí)際情況是我們經(jīng)常會遇到內(nèi)存不夠用的時候。
當(dāng)您的服務(wù)器沒有足夠的內(nèi)存時,在內(nèi)存需求高峰期間,交換空間將被頻繁使用并且明顯增多。
如果您沒有足夠的內(nèi)存并且沒有交換空間,這通常會導(dǎo)致無法為需要更多內(nèi)存的進(jìn)程分配內(nèi)存。
作為最后的手段,內(nèi)核將部署OOM殺手來終止高內(nèi)存使用的進(jìn)程,比如MySQL、Java。
要更詳細(xì)地了解Linux交換空間Swap,請閱讀Linux內(nèi)核文檔中的交換空間管理和Page Frame回收文檔。
如果您的交換空間已使用
始終為0,那么您確實(shí)有大量空閑可用的內(nèi)存RAM,在這種情況下,刪除交換空間可能是最好的。
總的來說交換空間I/O的性能很差。如果Linux服務(wù)器確實(shí)有大量空閑可用的內(nèi)存RAM,則應(yīng)調(diào)整或禁用交換空間。
禁用交換空間后,當(dāng)服務(wù)器急劇需要內(nèi)存時,將缺少更多的反應(yīng)時間,OOM可能會不等你反應(yīng)過來,就將消耗大量內(nèi)存的進(jìn)程殺死。
內(nèi)核緩存壓力和交換空間
假設(shè)您已啟用交換空間??梢钥紤]按照以下教程調(diào)整服務(wù)器的緩存壓力和交換空間的swappiness值。
vfs_cache_pressure控制內(nèi)核回收內(nèi)存的頻率,用于緩存頁面和inode對象。默認(rèn)值是100。我們推薦設(shè)置50到200。
swappiness此值用于定義內(nèi)核交換內(nèi)存頁面的頻繁程度。較高的值會導(dǎo)致頻繁使用交換空間,從而影響Linux服務(wù)器性能。
較低的值會減少使用交換空間的頻率。默認(rèn)值是60,我們推薦設(shè)置1到60之間。如果你需要改變vfs_cache_pressure
和swappiness
的值。
請使用你喜歡的編輯器打開etc/sysctl.conf
文件。在本教程中我們將使用vim打開文件。添加或替換vm.swappiness
和vm.vfs_cache_pressure
值。
sudo vim etc/sysctl.conf
vm.swappiness=10
vm.vfs_cache_pressure=200
例如,如果您在內(nèi)存不足時,您可以嘗試將swappiness值設(shè)置為10,vfs_cache_pressure的值設(shè)置200。
這將會使內(nèi)存回收變得更快,增加內(nèi)存緩存壓力。我們知道緩存對性能有好處,快速的內(nèi)存回收會適得其反。
但是與過于頻繁的使用交換空間相比,增大vfs_cache_pressure值會更好一點(diǎn)。
因此,不在內(nèi)存中保留盡可能多的緩存將有助于減少使用交換空間的頻率。此外,將vm.swappiness設(shè)置為10,將減少交換空間的使用。
假如你的Linux服務(wù)器在具有大量空閑可用的內(nèi)存,你可以嘗試將swappiness
和vfs_cache_pressure
修改為以下值。
vm.swappiness=10
vm.vfs_cache_pressure=50
這將降低緩存壓力。由于緩存對性能有好處,我們希望將緩存數(shù)據(jù)在內(nèi)存中保留更長時間。由于緩存會變大,我們?nèi)匀幌M麥p少交換空間的使用,從而降低磁盤I/O。
你可以使用以下cat命令查看swappiness
和vfs_cache_pressure
的當(dāng)前值:
sudo cat /proc/sys/vm/swappiness
sudo cat /proc/sys/vm/vfs_cache_pressure
如果你要在不重新啟動Linux服務(wù)器的情況下臨時啟用并設(shè)置swappiness
和vfs_cache_pressure
的值,請運(yùn)行以下sysctl
命令:
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50
結(jié)論
至此,你應(yīng)該了解在Linux上使用和不使用交換空間的區(qū)別,在使用交換空間時你將獲得更多反應(yīng)時間與更好的Linux服務(wù)器性能。
如何在交換空間和內(nèi)存的使用上作出取舍,如你有任何疑問,請在評論反饋。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40275 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9123瀏覽量
85322 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74002
發(fā)布評論請先 登錄
相關(guān)推薦
評論