溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控

發(fā)布時(shí)間:2021-11-03 17:01:11 來(lái)源:億速云 閱讀:267 作者:柒染 欄目:建站服務(wù)器

這篇文章給大家介紹Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

這兩天我們的一個(gè)核心系統(tǒng),一套集群,逐臺(tái)開始報(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)存?他的解釋是,這是正?,F(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)存,則可以無(wú)縫地使用這些內(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)用來(lái)緩存一些最近訪問過,而且不久的將來(lái)會(huì)被再次使用的數(shù)據(jù),但若有一些更重要的進(jìn)程需要這些內(nèi)存,是可以非常輕松地釋放出來(lá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是指用來(lái)給塊設(shè)備做的緩沖大小,他只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages。cached是用來(lái)給文件做緩沖。
(b) buffers是用來(lái)存儲(chǔ)目錄里面有什么內(nèi)容,權(quán)限等等。而cached直接用來(lái)記憶我們打開的文件,比如先后執(zhí)行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。而buffers隨時(shí)都在增加,比如先后兩次使用ls /dev后,就會(huì)發(fā)現(xiàn)第二次執(zhí)行的速度會(huì)較第一次快。

從不同角度,對(duì)內(nèi)存占用率有不同的理解,以下圖為例,

Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控

(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%。

因此對(duì)于開始的問題,我們關(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ú)論從網(wǎng)上的資料,還是實(shí)際的工作經(jīng)驗(yàn),都會(huì)有各種不同的方法,這兒我只是簡(jiǎn)單說一下,如何使用Python監(jiān)控內(nèi)存使用率。

(1) 不使用任何第三方庫(kù)實(shí)現(xiàn)

思路很簡(jiǎ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) 使用第三方庫(kù)psutil

psutil是一個(gè)跨平臺(tái)的進(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

使用第三方庫(kù),這問題就非常容易了,

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è)跨平臺(tái)的進(jìn)程管理和系統(tǒng)工具的python庫(kù),可以處理系統(tǒng)CPU,memory,disks,network等信息。主要用于系統(tǒng)資源的監(jiān)控,分析,以及對(duì)進(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指令來(lái)解析輸出,若可以使用psutil第三方庫(kù),則更為簡(jiǎn)便。

關(guān)于Linux實(shí)際內(nèi)存占用率算法以及如何使用Python實(shí)現(xiàn)內(nèi)存監(jiān)控就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI