最近在做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