Linux系統提供了很多關於系統和特定進程對於內存的使用情況的探測和管理工具,其中最耳熟能詳的就是free和top。free命令可以爲用戶提供系統級的內存使用情況報告,top命令更爲強大,其可以提供整個系統中所有進程的當前狀態信息,當然包括內存使用情況信息。
雖然,我們平時經常接觸這兩個命令,但,真正的要說出兩個命令所提供的系統信息的真實含義時,總是感覺有些模棱兩可。所以,本文旨在徹底理解兩者關於內存監測的真正原理,從工具的源碼層次進行分析,並解析RSS、VSS、PSS、USS、buffer/cache等概念。
free
基本使用
free,顧名思義,該命令主要用於實時的顯示整個系統內存的使用和剩餘情況。
該命令的一般輸出如下:
total used free shared buffers cached
Mem: 4029076 3433396 595680 21424 522964 1926528
-/+ buffers/cache: 983904 3045172
Swap: 1046524 0 1046524
爲了輸出更適合人類閱讀的內存信息,我們可以使用-h選項,它會顯示自動縮放到最短三位數單位的所有輸出字段,並顯示打印輸出的單位,如:
total used free shared buffers cached
Mem: 3.8G 3.3G 577M 20M 510M 1.8G
-/+ buffers/cache: 964M 2.9G
Swap: 1.0G 0B 1.0G
其中,
B = bytes
K = kilos
M = megas
G = gigas
T = teras
原理
可以看到free命令的輸出,分爲四行:
- 第一行爲每個量的標題
- 第二行爲系統整個內存的實時使用情況
- 第三行爲系統內存另一種更爲有意義的表示方式
- 第四行爲系統交換分區的使用情況
下面分行來解釋各個量的含義:
-
Mem:該行的大部量都是來自sysinfo系統調用返回的系統信息,cached通過/proc/meminfo中的Cached:獲得。其中,total = used + free。
-
-/+ buffers/cache:通過將Mem行中cached、buffers計入空閒內存,來提供更爲有意義的內存使用情況表示,基於此,
-/+ buffers/cache.free = Mem.cached + Mem.buffers + Mem.free -/+ buffers/cache.used = Mem.total - (-/+ buffers/cache.free) 其中,Mem、-/+ buffers/cache.free分別用於索引第一行、第二行各個數據。
-
Swap:顯示系統當前交換分區的使用的情況。
cached/buffers的區別
想要搞明白cached和buffers區別,可以通過一個簡單的例子來實現:
-
首先使用fdisk -l列出系統中的所有分區,比如:
設備 啓動 起點 終點 塊數 Id 系統 /dev/sda1 * 2048 417333247 208665600 83 Linux /dev/sda2 417335294 419428351 1046529 5 擴展 /dev/sda5 417335296 419428351 1046528 82 Linux 交換 / Solaris
我們隨便挑選一個分區作爲如下命令的參數:
cat /dev/sda1 > /dev/null
使用如下命令觀察buffers的變化:
while true; do sleep 1; free ; done
正常情況下可以觀察到buffers一直在增長。
-
挑選一個一個比較大都文件作爲下面命令的參數:
cat bigfile > /dev/null
使用如下命令觀察cached的變化:
while true; do sleep 1; free ; done
正常情況下可以觀察到cached一直在增長。
-
從上面的例子可以看出,cached和buffers的區別:
- buffers:用於緩存裸設備或磁盤分區的數據,例如,上面的/dev/sda1
- cached:用於緩存文件系統相關文件的數據,例如,bigfile
- buffers:應用於直接訪問裸分區
- 文件系統本身的實現,會認爲/dev/sda1是個裸設備,因此文件系統的metadata會緩存到buffers