1. 程式人生 > >深入淺出記憶體管理--對於watermark的理解

深入淺出記憶體管理--對於watermark的理解

經過前面文章的介紹,每個記憶體管理區都有一個數組watermark,核心中定義了三個watermark來表示當前系統剩餘的空閒記憶體。

WMARK_MIN,
WMARK_LOW,
WMARK_HIGH,

watermark

  • high
    當剩餘記憶體在high以上時,系統認為當前記憶體使用壓力不大。
  • low
    當剩餘記憶體降低到low時,系統就認為記憶體已經不足了,會觸發kswapd核心執行緒進行記憶體回收處理
  • min
    當剩餘記憶體在min以下時,則系統記憶體壓力非常大。一般情況下min以下的記憶體是不會被分配的,min以下的記憶體預設是保留給特殊用途使用,屬於保留的頁框,用於原子的記憶體請求操作。
    比如:當我們在中斷上下文申請或者在不允許睡眠的地方申請記憶體時,可以採用標誌GFP_ATOMIC來分配記憶體,此時才會允許我們使用保留在min水位以下的記憶體。

對頁面回收的影響

  • kswapd週期回收機制
    從上面對三種水位的介紹,high水位時記憶體很充足,核心不用特意做回收的動作,那麼它存在的意義是什麼呢?
    實際上,當記憶體降低到low watermark時,核心執行緒kswapd開始進行回收頁面,但回收頁面要回收到什麼程度為止呢?這時high watermark存在的意義就體現出來了,當kswapd回收頁面發現此時記憶體終於達到了high水位,那麼系統認為記憶體已經不再緊張了,所以將會停止進一步的操作。
  • 記憶體緊缺直接回收機制
    如果記憶體達到或者低於min watermark時,會觸發核心直接回收操作(direct reclaim)

水位的設定

水位的設定與系統保留記憶體的數量有關,存放在min_free_kbytes中,它在核心初始化時設定,取決於直接對映區實體記憶體的數量。

min_free_kbytes = 16

s i z e \sqrt{16*直接對映區記憶體size} (KB)

每個管理區(zone)中的min watermark是與min_free_kbytes有關的。

比如:
我使用的平臺上,直接對映區上有兩個管理區:ZONE_DMA/ZONE_NORMAL,那麼他們中的min水位就是按照大小比例來分配的。兩個管理區的min watermark相加應該等於min_free_kbytes。通過系統節點/proc/sys/vm/min_free_kbytes也可以看到系統總的保留實體記憶體大小。

計算得到min watermark後,再根據min的大小分別算出每個zone的low和high水位標記。
計算方法:

low = min × 5 / 4;
high = min × 3 / 2;