問題:前段時間在做服務器巡檢時發現系統可用內存值小於空閑內存值
分析:查詢網上各種資料,都說的是 available=free + buff/cache 這樣一個大致計算方式,按這種方式解釋不了上面的情況。
最后查到linux內核源代碼中關於avaliable值的定義,得出如下公式:
MemAvailable = MemFree - LowWaterMark + (PageCache - min(PageCache / 2, LowWaterMark))
其中 LowWaterMark 由 min_free_kbytes 參數影響,計算方式如下:
watermark[min] = min_free_kbytes換算為page單位即可,假設為min_free_pages。(因為是每個zone各有一套watermark參數,實際計算效果是根據各個zone大小所占內存總大小的比例,而算出來的per zone min_free_pages)
watermark[low] = watermark[min] * 5 / 4
watermark[high] = watermark[min] * 3 / 2
結論:當在空閑內存較小,且又設置內存回收閾值的min_free_kbytes的情況下,就會出現上圖的情況,可通過減少min_free_kbytes值來使可用內存值大於空閑內存。
參考資料: