Linux MemFree與MemAvailable的區別

  最近在做Prometheus的監控,結合Grafana做前端展示,其中涉及到內存的時候,有不少人對Memory Free和Memory Avaliable這兩個參數比較疑惑,這裏我結合linux下常用的查看內存使用情況的free命令,做下解答整理。

  Linux查看內存使用情況,可以查看/proc/meminfo和使用free命令。

root@prometheus-01:~# cat /proc/meminfo && free
MemTotal:       16433020 kB
MemFree:        14714596 kB
MemAvailable:   15812952 kB
Buffers:          197912 kB
Cached:          1020632 kB
SwapCached:            0 kB
Active:          1168468 kB
Inactive:         328608 kB
Active(anon):     278888 kB
Inactive(anon):      376 kB
Active(file):     889580 kB
Inactive(file):   328232 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       8388604 kB
SwapFree:        8388604 kB
Dirty:                36 kB
Writeback:             0 kB
AnonPages:        278524 kB
Mapped:            63220 kB
Shmem:               740 kB
Slab:             124140 kB
SReclaimable:      98956 kB
SUnreclaim:        25184 kB
KernelStack:        3232 kB
PageTables:         3012 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16605112 kB
Committed_AS:     408132 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      173540 kB
VmallocChunk:   34359557144 kB
HardwareCorrupted:     0 kB
AnonHugePages:    231424 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      106432 kB
DirectMap2M:     4087808 kB
DirectMap1G:    14680064 kB
             total       used       free     shared    buffers     cached
Mem:      16433020    1718720   14714300        740     197912    1020632
-/+ buffers/cache:     500176   15932844
Swap:      8388604          0    8388604

  從結果來看,/proc/meminfo裏的MemTotal、MemFree、Buffers、Cached是能夠分別和free輸出結果的“Mem”行一一對應的。

名詞解釋

  這裏先解釋下幾個關鍵詞:

1、MemTotal:內存總數

  系統從加電開始到引導完成,BIOS等要保留一些內存,內核要保留一些內存,最後剩下可供系統支配的內存就是MemTotal。這個值在系統運行期間一般是固定不變的。

2、MemFree:空閒內存數

  表示系統尚未使用的內存。MemUsed=MemTotal-MemFree就是已被用掉的內存。

3、MemAvailable:可用內存數

  應用程序可用內存數。系統中有些內存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的內存,這部分可回收的內存加上MemFree纔是系統可用的內存,即:MemAvailable≈MemFree+Buffers+Cached,它是內核使用特定的算法計算出來的,是一個估計值。它與MemFree的關鍵區別點在於,MemFree是說的系統層面,MemAvailable是說的應用程序層面。

4、Buffer:緩衝區內存數

5、Cache:緩存區內存數

6、Shared:多個進程共享的內存空間,不常用,暫不討論。

  Buffer與Cache的區別:

這裏說下buffer與cache的區別,首先,從字面意義上講,buffer是緩衝的意思,cache是緩存的意思。舉個現實中的例子,比說鐵道頭上像彈簧一樣的東西,就叫緩衝;部署在森林裏的存應急物資的保管箱,名叫“Food Cache”,類似一種保存箱。  其次,常見的說法,叫write-buffer和read-cache,buffer一般用作寫操作上,cache一般用在讀操作上,不過也不是一成不變的;  舉例說明,每秒要寫100次硬盤,對系統衝擊很大,浪費了大量時間在忙着處理開始寫和結束寫這兩件事嘛。用buffer暫存起來,變成每10秒寫一次硬盤,對系統的衝擊就很小,寫入效率高了;Cache 是爲了彌補高速設備和低速設備的鴻溝而引入的中間層,最終起到加快取速度的作用。比如你一個很複雜的計算做完了,下次還要用結果,就把結果放手邊一個好拿的地方存着,下次不用再算了,加快了數據取用的速度。(可以參考知乎上的回答:https://www.zhihu.com/question/26190832

計算公式:

參照free的輸出結果,這裏有幾個計算公式:

root@prometheus-02:~# free
             total       used       free     shared    buffers     cached
Mem:      16433020    1827360   14605660        740     203540    1051400
-/+ buffers/cache:     572420   15860600
Swap:      8388604          0    8388604

爲了直觀說明,把第2行,Mem的行我這裏稱作OS Mem,第三行 buffers/cache行,稱作APP buffer/cache:

OS Mem total = OS Mem used + OS Mem free

APP buffers/cache used = OS Mem used - OS Mem buffers - OS Mem cached

APP buffers/cache free = OS Mem free + OS Mem buffers + OS Mem cached

APP buffers/cache total = APP buffers/cache used + APP buffers/cache free = OS Mem total

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章