1. 程式人生 > 實用技巧 >系統記憶體還有很多的情況下為何swap使用很高了

系統記憶體還有很多的情況下為何swap使用很高了

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方式回收記憶體

檢視記憶體和node

檢視zone_reclaim_mode的引數值
記憶體回收機制

  • 到這裡,我們就可以理解記憶體回收機制了。這些回收的記憶體既包括了檔案頁,又包括了匿名頁
  • 對檔案頁的回收,就是直接回收快取,或者把髒頁寫回磁碟後再回收
  • 對匿名頁的回收,其實就是通過Swap機制,把它們寫入磁碟後再釋放記憶體
  • 這兩種不同的記憶體回收機制,在實際的記憶體回收過程中,到底應該先回收哪一種呢

swapiness

  • Linux提供了一個swapiness選項,用來調整使用swap的積極程度
  • 範圍是0-100,數值越大,表示越積極使用Swap,也就是更傾向於回收匿名頁數
  • 數值越小,越消極使用Swap,也就是更傾向於回收檔案頁
  • 預設的60是一個比較中和的值,系統會根據實際執行情況,選擇合適的記憶體回收型別,比如回收不活躍的匿名頁,或者不活躍的檔案頁

檢視系統的swapiness
Swap被哪些應用佔用

  • 可以使用以下命令來檢視系統的Swap被哪些應用所佔用

檢視應用所佔的Swap
關掉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等。