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