linux 查看内存用量_正确计算linux系统内存使用率
圖中的例子很典型,就是:多數(shù)的linux系統(tǒng)在free命令后會發(fā)現(xiàn)free(剩余)的內(nèi)存很少,而自己又沒有開過多的程序或服務。
對于上述的情況,正確的解釋是:
linux的內(nèi)存管理機制與windows的有所不同。具體的機制我們無需知道,我們需要知道的是,linux的內(nèi)存管理機制的思想包括(不敢說就是)內(nèi)存利用率最大化。內(nèi)核會把剩余的內(nèi)存申請為cached,而cached不屬于free范疇。當系統(tǒng)運行時間較久,會發(fā)現(xiàn)cached很大,對于有頻繁文件讀寫操作的系統(tǒng),這種現(xiàn)象會更加明顯。
直觀的看,此時free的內(nèi)存會非常小,但并不代表可用的內(nèi)存小,當一個程序需要申請較大的內(nèi)存時,如果free的內(nèi)存不夠,內(nèi)核會把部分cached的內(nèi)存回收,回收的內(nèi)存再分配給應用程序。所以對于linux系統(tǒng),可用于分配的內(nèi)存不只是free的內(nèi)存,還包括cached的內(nèi)存(其實還包括buffers)。
1、通過定期采集/proc文件系統(tǒng)內(nèi)的meminfo文件來獲取當前內(nèi)存使用情況:
proc文件系統(tǒng)是一個偽文件系統(tǒng),它只存在內(nèi)存當中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口。用戶和應用程序可以通過proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息,如進程,是動態(tài)改變的,所以用戶或應用程序讀取proc文件時,proc文件系統(tǒng)是動態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的采集流程圖。
/proc/meminfo 信息如下:
需要使用的指標有:MemTotal ,MemFree,Buffers,Cached
MemTotal:總內(nèi)存大小
MemFree: 空閑內(nèi)存大小
Buffers和Cached:磁盤緩存的大小
Buffers和Cached的區(qū)別:
buffers 是指用來給塊設備做的緩沖大小,他只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages.
cached 是用來給文件做緩沖。
buffers 是用來存儲目錄里面有什么內(nèi)容,權(quán)限等等。
而cached直接用來記憶我們打開的文件,比如先后執(zhí)行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。
而buffers隨時都在增加,比如先后兩次使用ls /dev后,就會發(fā)現(xiàn)第二次執(zhí)行的速度會較第一次快。
這就是buffers/chached的區(qū)別。
2、下面分別從操作系統(tǒng)角度和應用程序角度來區(qū)別Buffers和Cached
使用free命令可以看到
對操作系統(tǒng)來說,Buffers和Cached是已經(jīng)被使用的(上圖Mem:這一行)
MemFree=total-used
314952=24946552-24631600
對應用程序來說(上圖對應-/+ buffers/cache那一行)
MemFree=buffers+cached+free
19536392=152116+19069324+314952
所以本著監(jiān)控應用對物理內(nèi)存使用情況的目的采取如下計算方法:
內(nèi)存使用率(MEMUsedPerc)=100*(MemTotal-MemFree-Buffers-Cached)/MemTotal
在這里為了PatrolAgent的監(jiān)控性能,采用定期讀取/proc/meminfo文件來獲取MemTotal ,MemFree,Buffers,Cached這些參數(shù)的值
該算法在MEMORY.km中實現(xiàn)。
===============================================================
通過看free命令的說明可以發(fā)現(xiàn),free命令的數(shù)值是從/proc/meminfo文件重讀取的。查看free的源碼包查看其源碼,明確知道了其中的每個數(shù)值的來源(具體內(nèi)容可查看linux命令free源碼解讀:Procps free.c)。
有時我們計算內(nèi)存使用率的時候會讀取free命令的回顯,但有時也會直接讀取文件/proc/meminfo的內(nèi)容,畢竟free命令的回顯數(shù)據(jù)就是從meminfo文件中獲得的。
然而,由于不同的linux發(fā)行版,在系統(tǒng)制作過程中會修改部分源碼。一般的系統(tǒng)(如Debian)使用free命令和讀取meminfo文件兩種方式計算的內(nèi)存使用率是相同的。但是對于部分系統(tǒng),如SUSE(并不確定是每個版本的都是,這里指SUSE Enterprise Server 11),其在free命令回顯的結(jié)果中,cached部分的值并不等于meminfo文件中的cached所顯示的值,而是等于meminfo文件中cached部分和SReclaimable部分之和。
也就是說,debian之類的系統(tǒng)認為:
可用內(nèi)存=free的內(nèi)存+cached的內(nèi)存+buffers的內(nèi)存
而SUSE之類的系統(tǒng)則認為:
可用內(nèi)存=free的內(nèi)存+cached的內(nèi)存+buffers的內(nèi)存+SReclaimable的內(nèi)存
PS:什么是SReclaimable?在linux內(nèi)核中會有許多小對象,這些對象構(gòu)造銷毀十分頻繁,比如i-node,dentry。這么這些對象如果每次構(gòu)建的時候就向內(nèi)存要一個頁,而其實際大小可能只有幾個字節(jié),這樣就非常浪費,為了解決這個問題就引入了一種新的機制來處理在同一頁框中如何分配小存儲器區(qū),這個機制可以減少申請和釋放內(nèi)存帶來的消耗,這些小存儲器區(qū)的內(nèi)存稱為Slab。meminfo文件中標識了Slab的大小,而SReclaimable是指可收回Slab的大小。
總結(jié)
以上是生活随笔為你收集整理的linux 查看内存用量_正确计算linux系统内存使用率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]SYSCALL_DEFINE宏定
- 下一篇: 高级运维工程师证书_高级装配式工程师证书