Linux內存工具解析之free

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命令的輸出,分爲四行:

  1. 第一行爲每個量的標題
  2. 第二行爲系統整個內存的實時使用情況
  3. 第三行爲系統內存另一種更爲有意義的表示方式
  4. 第四行爲系統交換分區的使用情況

下面分行來解釋各個量的含義:

  1. Mem:該行的大部量都是來自sysinfo系統調用返回的系統信息,cached通過/proc/meminfo中的Cached:獲得。其中,total = used + free。

  2. -/+ 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分別用於索引第一行、第二行各個數據。
    
  3. Swap:顯示系統當前交換分區的使用的情況。

cached/buffers的區別

想要搞明白cached和buffers區別,可以通過一個簡單的例子來實現:

  1. 首先使用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一直在增長。

  2. 挑選一個一個比較大都文件作爲下面命令的參數:

     cat bigfile > /dev/null
    

    使用如下命令觀察cached的變化:

     while true; do sleep 1; free ; done
    

    正常情況下可以觀察到cached一直在增長。

  3. 從上面的例子可以看出,cached和buffers的區別:

    • buffers:用於緩存裸設備或磁盤分區的數據,例如,上面的/dev/sda1
    • cached:用於緩存文件系統相關文件的數據,例如,bigfile
    • buffers:應用於直接訪問裸分區
    • 文件系統本身的實現,會認爲/dev/sda1是個裸設備,因此文件系統的metadata會緩存到buffers
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章