深入淺出記憶體管理--對於watermark的理解
阿新 • • 發佈:2018-12-16
經過前面文章的介紹,每個記憶體管理區都有一個數組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 = (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;