這篇文章給大家介紹Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
從事成都聯(lián)通服務(wù)器托管,服務(wù)器租用,云主機(jī),雅安服務(wù)器托管,空間域名,CDN,網(wǎng)絡(luò)代維等服務(wù)。這兩天我們的一個(gè)核心系統(tǒng),一套集群,逐臺開始報(bào)警,內(nèi)容是內(nèi)存占用超閾值。按說這應(yīng)該是一個(gè)非常緊急且需要立即處理的報(bào)警,但實(shí)際是不是這樣,待我們撥云見日。
以下為模擬實(shí)驗(yàn),
了解了下監(jiān)控系統(tǒng)這條內(nèi)存占用超閾值報(bào)警的計(jì)算方法,是用used/total*100%=1949/1988*100%=98%,即內(nèi)存占用量超過了98%。
網(wǎng)上學(xué)習(xí)了一番,其實(shí)這種計(jì)算方法不很準(zhǔn)確,原因就是Linux的內(nèi)存管理機(jī)制和Windows是不相同的,我理解Linux管理內(nèi)存的特點(diǎn),其中之一就是充分利用內(nèi)存,網(wǎng)上這方面的資料,非常容易檢索,我就不班門弄斧了。從MOS上看見了一些文章,直接或間接說明了這個(gè)問題,
(1) Memory Not Being Released In Linux Top After The MDEX Engine Is Shut Down (文檔 ID 2045288.1)
問題是說為什么關(guān)閉了軟件,從top中沒有看見應(yīng)用的釋放內(nèi)存?他的解釋是,這是正常現(xiàn)象,top指令的memory部分展示的RAM是“緩存”的部分。這些緩存的部分表示磁盤中最近使用的數(shù)據(jù)且臨時(shí)被存入RAM了。當(dāng)停止一個(gè)應(yīng)用程序的時(shí)候,不會(huì)“釋放內(nèi)存”,一旦重啟應(yīng)用,這些信息在緩存之中,可以提高性能。然而,如果關(guān)閉了應(yīng)用程序許久,其他的進(jìn)程需要這些內(nèi)存,則可以無縫地使用這些內(nèi)存。操作系統(tǒng)會(huì)回收盡可能少的數(shù)據(jù)段,分配給新的進(jìn)程。
(2) Summary Area in top output Shows Low Free Memory (文檔 ID 460141.1)
Unix系統(tǒng)已經(jīng)做了一些優(yōu)化,可以充分利用所有可以使用的資源。不被代碼或數(shù)據(jù)使用的內(nèi)存資源會(huì)被OS用于各種用途。top指令輸出中的匯總部分,未說明內(nèi)核和用戶進(jìn)程的內(nèi)存,單獨(dú)看空閑的內(nèi)存量非常低,并不能說明內(nèi)存使用問題。未被進(jìn)程使用的內(nèi)存會(huì)被操作系統(tǒng)用來緩存一些最近訪問過,而且不久的將來會(huì)被再次使用的數(shù)據(jù),但若有一些更重要的進(jìn)程需要這些內(nèi)存,是可以非常輕松地釋放出來。
那么真實(shí)的內(nèi)存占用率,應(yīng)該如何計(jì)算?
首先我們說下free輸出中,buffers和cached的區(qū)別。參考(http://blog.chinaunix.net/uid-24709751-id-3564801.html)給出的buffers和cached的區(qū)別說明,
(a) buffers是指用來給塊設(shè)備做的緩沖大小,他只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages。cached是用來給文件做緩沖。
(b)
buffers是用來存儲目錄里面有什么內(nèi)容,權(quán)限等等。而cached直接用來記憶我們打開的文件,比如先后執(zhí)行兩次命令#man X
,你就可以明顯的感覺到第二次的開打的速度快很多。而buffers隨時(shí)都在增加,比如先后兩次使用ls
/dev后,就會(huì)發(fā)現(xiàn)第二次執(zhí)行的速度會(huì)較第一次快。
從不同角度,對內(nèi)存占用率有不同的理解,以下圖為例,
(1) 站在操作系統(tǒng)的角度,buffer和cache的內(nèi)存是屬于分配的內(nèi)存,因此內(nèi)存占用率計(jì)算方法=used/total*100%。
(2) 站在使用者的角度上看,buffer和cache的內(nèi)存是可以被重用的,因此內(nèi)存占用率計(jì)算方法=(used-buffers-cached)/total*100%。
因此對于開始的問題,我們關(guān)注的是應(yīng)用可用內(nèi)存,所以我們需要監(jiān)控關(guān)注的內(nèi)存實(shí)際占用率應(yīng)該為,
(used-buffers-cached)/total*100%=(1949-99-1053)/1988*100%=40%,
再進(jìn)一步,關(guān)于如何監(jiān)控內(nèi)存使用,無論從網(wǎng)上的資料,還是實(shí)際的工作經(jīng)驗(yàn),都會(huì)有各種不同的方法,這兒我只是簡單說一下,如何使用Python監(jiān)控內(nèi)存使用率。
(1) 不使用任何第三方庫實(shí)現(xiàn)
思路很簡單,就是執(zhí)行free指令,解析回顯,得出used、buffers、cached、total這些參數(shù)值,再進(jìn)行計(jì)算。
output = os.popen('free -m')
output.readline()
line = ','.join(output.readline().split()).split(',')
total = float(line[1])
used = float(line[2])
buffers = float(line[5])
cached = float(line[6])
percent = int(round((used - buffers - cached) / total * 100))
結(jié)果向上取整,例如25%,注意需要使用float浮點(diǎn)型,否則計(jì)算percent的時(shí)候未乘以100前就已經(jīng)是0了。
(2) 使用第三方庫psutil
psutil是一個(gè)跨平臺的進(jìn)程管理,首先需要安裝,psutil安裝之前需要安裝python-devel,均需要root用戶,我的操作系統(tǒng)是Linux 6.5,Python版本2.6.6,這兩個(gè)包的版本則為
(a) python-devel-2.6.6-51.el6.x86_64.rpm
(b) psutil-2.0.0
使用第三方庫,這問題就非常容易了,
import psutil
percent = mem.percent
這里的mem.percent=(mem.total - mem.available) / mem.total * 100,其中mem.available=mem.free + mem.buffers + mem.cached,和(1)中計(jì)算方法是一致的。
其實(shí)psutil可以執(zhí)行幾乎所有,系統(tǒng)監(jiān)控相關(guān)的指令操作,
Github地址,https://github.com/giampaolo/psutil/
這篇文章的介紹非常清晰,http://www.jianshu.com/p/64e265f663f6
psutil(Python system and process utilities)是一個(gè)跨平臺的進(jìn)程管理和系統(tǒng)工具的python庫,可以處理系統(tǒng)CPU,memory,disks,network等信息。主要用于系統(tǒng)資源的監(jiān)控,分析,以及對進(jìn)程進(jìn)行一定的管理。通過psutil可以實(shí)現(xiàn)如ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。在Linux,windows,OSX,freebsdSun Solaris等系統(tǒng)上工作,最新的版本python是要高于2.6(Python 2.4 Python2.5 可以用2.1.3版本)
總結(jié):
1. Linux下實(shí)際我們關(guān)注的是,系統(tǒng)可用內(nèi)存的占用率,計(jì)算方法為(used-buffers-cached)/total*100%,并不是執(zhí)行free指令中free顯示的部分。
2. 內(nèi)存占用率監(jiān)控Python實(shí)現(xiàn),可以使用執(zhí)行free指令來解析輸出,若可以使用psutil第三方庫,則更為簡便。
關(guān)于Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。