1. 程式人生 > >正確計算linux系統記憶體使用率

正確計算linux系統記憶體使用率

圖中的例子很典型,就是:多數的linux系統在free命令後會發現free(剩餘)的記憶體很少,而自己又沒有開過多的程式或服務。對於上述的情況,正確的解釋是:linux的記憶體管理機制與windows的有所不同。具體的機制我們無需知道,我們需要知道的是,linux的記憶體管理機制的思想包括(不敢說就是)記憶體利用率最大化。核心會把剩餘的記憶體申請為cached,而cached不屬於free範疇。當系統執行時間較久,會發現cached很大,對於有頻繁檔案讀寫操作的系統,這種現象會更加明顯。

 

直觀的看,此時free的記憶體會非常小,但並不代表可用的記憶體小,當一個程式需要申請較大的記憶體時,如果free的記憶體不夠,核心會把部分cached的記憶體回收,回收的記憶體再分配給應用程式。所以對於linux系統,可用於分配的記憶體不只是free的記憶體,還包括cached的記憶體(其實還包括buffers)。

 

 

1、通過定期採集/proc檔案系統內的meminfo檔案來獲取當前記憶體使用情況:

proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需資訊並提交的採集流程圖。/proc/meminfo 資訊如下: 需要使用的指標有:MemTotal ,MemFree,Buffers,Cached

 

MemTotal:總記憶體大小

MemFree: 空閒記憶體大小

Buffers和Cached:磁碟快取的大小Buffers和Cached的區別:buffers 是指用來給塊裝置做的緩衝大小,他只記錄檔案系統的metadata以及 tracking in-flight pages.

cached 是用來給檔案做緩衝。

buffers 是用來儲存目錄裡面有什麼內容,許可權等等。

而cached直接用來記憶我們開啟的檔案,比如先後執行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。

而buffers隨時都在增加,比如先後兩次使用ls /dev後,就會發現第二次執行的速度會較第一次快。

這就是buffers/chached的區別。

 

2、下面分別從作業系統角度和應用程式角度來區別Buffers和Cached

使用free命令可以看到

對作業系統來說,Buffers和Cached是已經被使用的(上圖Mem:這一行)

     1      MemFree=total-used

     2      314952=24946552-24631600

 

對應用程式來說(上圖對應-/+ buffers/cache那一行)

     1      MemFree=buffers+cached+free

     2      19536392=152116+19069324+314952

 

 

 

通過看free命令的說明可以發現,free命令的數值是從/proc/meminfo檔案重讀取的。檢視free的原始碼包檢視其原始碼,明確知道了其中的每個數值的來源(具體內容可檢視linux命令free原始碼解讀:Procps free.c)。

有時我們計算記憶體使用率的時候會讀取free命令的回顯,但有時也會直接讀取檔案/proc/meminfo的內容,畢竟free命令的回顯資料就是從meminfo檔案中獲得的。

 

然而,由於不同的linux發行版,在系統製作過程中會修改部分原始碼。一般的系統(如Debian)使用free命令和讀取meminfo檔案兩種方式計算的記憶體使用率是相同的。但是對於部分系統,如SUSE(並不確定是每個版本的都是,這裡指SUSE Enterprise Server 11),其在free命令回顯的結果中,cached部分的值並不等於meminfo檔案中的cached所顯示的值,而是等於meminfo檔案中cached部分和SReclaimable部分之和。

 

也就是說,debian之類的系統認為:

     可用記憶體=free的記憶體+cached的記憶體+buffers的記憶體

 

而SUSE之類的系統則認為:

     可用記憶體=free的記憶體+cached的記憶體+buffers的記憶體+SReclaimable的記憶體

 

PS:什麼是SReclaimable?在linux核心中會有許多小物件,這些物件構造銷燬十分頻繁,比如i-node,dentry。那麼這些物件如果每次構建的時候就向記憶體要一個頁,而其實際大小可能只有幾個位元組,這樣就非常浪費,為了解決這個問題就引入了一種新的機制來處理在同一頁框中如何分配小儲存器區,這個機制可以減少申請和釋放記憶體帶來的消耗,這些小儲存器區的記憶體稱為Slab。meminfo檔案中標識了Slab的大小,而SReclaimable是指可收回Slab的大小。