系統記憶體還有很多的情況下為何swap使用很高了
阿新 • • 發佈:2020-10-11
Swap是什麼
- Swap就是把一塊磁碟空間或者一個本地檔案,當成記憶體來使用。
- 換出,就是把程序暫時不用的記憶體資料儲存到磁碟中
- 換入,就是在程序再次訪問這些記憶體的時候,從磁碟中讀取到記憶體
- Swap其實是把系統的可用記憶體變大了,這樣即使伺服器的記憶體不足,也可以騰出空間來執行大記憶體的應用程式。
- 既然Swap是為了回收記憶體,那麼Linux會在什麼時候需要回收記憶體呢?它又是怎麼來衡量記憶體是不是緊張或者壓力大呢?
記憶體回收是什麼?
- 記憶體回收是子系統釋放掉可以回收的記憶體
- 快取和緩衝區,他們在記憶體管理中,叫做檔案頁
- 大部分檔案頁可以直接回收,有需要的時候再從磁碟讀取
- 至於髒頁,就得先寫入磁碟,然後才能進行記憶體釋放
- 髒頁的回收,可以在應用程式中,通過系統呼叫fsync,或者有系統核心現成pdflush負責重新整理到磁碟
- Swap,應用程式動態分配的堆記憶體,他們在記憶體管理中叫做匿名頁
如何衡量記憶體是不是緊張了呢?
- 定期回收記憶體的核心執行緒kwapd0,定義了三個記憶體閥值,然後根據記憶體剩餘值的範圍來程序對應記憶體操作
- 頁最小閥值,記憶體壓力很大,無法進行正常分配
- 頁低閥值,記憶體有一定的壓力,但是可以進行正常分配
- 頁高閥值,記憶體無壓力
- 如果剩餘記憶體小於頁低閥值,就會出發記憶體回收了
- 頁低閥值可以檢視 /proc/sys/vm/min_free_kbytes
- min_free_kbytes設定了頁最小閥值,根據這個閥值可以計算另外兩個數值
- pages_low = pages_min*5/4
- pages_high = pages_min*3/2
記憶體閥值引數
- pages中的min、low、high,就是三個記憶體閥值
- free就是剩餘記憶體頁數,它跟後面的nr_free_pages相同
- nr_active_anon和nr_inactive_anon,分別是活躍和非活躍的匿名頁數
- nr_active_file和nr_inactive_file,分別是活躍和非活躍的檔案頁數
- 那記憶體引數裡面的Node0和Node1又是什麼呢?
NUMA架構
- 處理器的NUMA架構,在這種架構下,多個處理器被劃分到不同的Node上,同時每個Node都擁有自己的本地記憶體空間
- 當某個Node記憶體不足時,系統可以從本地記憶體中回收記憶體,也可以從其他Node尋找空閒記憶體。具體什麼模式,可以通過zone_reclaim_mode引數來調整
- 預設0,既可以本地回收記憶體,也可以從其他Node尋找空閒記憶體
- 1、2、4都表示只回收本地記憶體,2表示可以回寫髒資料回收記憶體,4表示可以用Swap方式回收記憶體
記憶體回收機制
- 到這裡,我們就可以理解記憶體回收機制了。這些回收的記憶體既包括了檔案頁,又包括了匿名頁
- 對檔案頁的回收,就是直接回收快取,或者把髒頁寫回磁碟後再回收
- 對匿名頁的回收,其實就是通過Swap機制,把它們寫入磁碟後再釋放記憶體
- 這兩種不同的記憶體回收機制,在實際的記憶體回收過程中,到底應該先回收哪一種呢
swapiness
- Linux提供了一個swapiness選項,用來調整使用swap的積極程度
- 範圍是0-100,數值越大,表示越積極使用Swap,也就是更傾向於回收匿名頁數
- 數值越小,越消極使用Swap,也就是更傾向於回收檔案頁
- 預設的60是一個比較中和的值,系統會根據實際執行情況,選擇合適的記憶體回收型別,比如回收不活躍的匿名頁,或者不活躍的檔案頁
Swap被哪些應用佔用
- 可以使用以下命令來檢視系統的Swap被哪些應用所佔用
關掉Swap會發生什麼
- 當記憶體足夠的時候,關掉Swap,Swap佔用的空間大小會儲存在記憶體當中去
- 當記憶體不夠的時候,沒法強行關掉Swap
解答十個問題
- 為什麼系統在可用記憶體還有很多的情況下,會用到swap? 答案:這個受numa架構引數值,swapiness引數值以及檔案頁和匿名頁不同記憶體物件的影響。
- swap到磁碟中的匿名頁,當再次被換入到記憶體中,那磁碟中的匿名頁會被釋放掉嗎? 答案:會的。
- 如果swap到磁碟中的匿名頁一直沒被使用,磁碟中如何進行釋放? 答案:會根據程序生命週期來進行釋放。
- 如果系統不開啟Swap,那匿名頁還怎麼回收? 答案:會一直儲存在記憶體中。
- 如果大量匿名頁把Swap都寫滿了,這個時候怎麼選擇從swap裡清理哪些匿名頁? 答案:大量匿名頁把Swap都寫滿了,說明記憶體不夠了,可能會出現OOM了。
- 核心中swapness使用的預設值是60,如果配置為0還會使用swap嗎? 答案:會的。這個值只是一個傾向值,即使為0,在記憶體緊張的情況下,還是有可能會用到。
- 當Swap升高時,系統性能會受到影響嗎? 答案:會的,Swap升高,說明系統中本來和記憶體打交道的一些操作會涉及到和磁碟打交道,IO效能會受到影響。
- 如果沒有swap,系統記憶體不夠了怎麼辦? 答案:OOM。
- cache、buffer和swap回收的記憶體物件有什麼不同? 答案:cache和buffer回收的是檔案頁,Swap回收的是匿名頁。
- 哪些應用或者服務應該關閉swap? 答案:對IO有很高要求的應用或者服務都應該關閉Swap,比如DB等。