python统计httpd 进程的内存占用百分比
本文結(jié)構(gòu):
介紹用命令行如何統(tǒng)計(jì)內(nèi)存占用百分比
介紹用python 如何通過讀取進(jìn)程文件,統(tǒng)計(jì)進(jìn)程的內(nèi)存總大小,然后計(jì)算占系統(tǒng)內(nèi)存的百分比
第一部分:
在linux 下,統(tǒng)計(jì)apache 進(jìn)程的內(nèi)存使用百分比,有很多方法:
使用命令將所有apache 的進(jìn)程進(jìn)行統(tǒng)計(jì),然后相加,然后和系統(tǒng)的物理內(nèi)存相除,求百分比。
1. 例如,用"ps ? -e "命令就可以看到所有進(jìn)程的詳細(xì)信息:
如圖,"ps ? aux" 命令輸出的第六個(gè)字段就是某個(gè)進(jìn)程所占的物理內(nèi)存,單位是KB.然后就可以將需要的apache 進(jìn)程過濾出來,統(tǒng)計(jì)。
最后,用free 就可以看到系統(tǒng)的總內(nèi)存:
第二部分:
2. 如果使用python 那么可以怎么實(shí)現(xiàn)?可以通過讀取文件,獲取各個(gè)apache 進(jìn)程的VmRSS(物理內(nèi)存)大小,以及系統(tǒng)的總內(nèi)存。
2.1 通過什么文件查看進(jìn)程占用內(nèi)存的信息?
在"/proc" 目錄下,那些數(shù)字目錄,就是代表系統(tǒng)中的一個(gè)進(jìn)程號的目錄,該進(jìn)程的狀態(tài)都在這個(gè)目錄下:
例如進(jìn)入29845進(jìn)程的目錄,29845 這個(gè)進(jìn)程的狀態(tài)信息都可以在status 這個(gè)文件查看:
然后,打開/proc/29845/status 文件:
如上圖,VmRSS 這行就是內(nèi)存大小。
2.2 如何獲取所有apache 的進(jìn)程id號?
因?yàn)閍pache 通常都會fork 很多的子進(jìn)程,這些子進(jìn)程都會占用內(nèi)存。linux下有這樣一個(gè)命令"pidof".如果想查看系統(tǒng)里所有httpd 進(jìn)程的pid 號,可以執(zhí)行"pidof ?httpd", 發(fā)現(xiàn)它和"ps aux|grep httpd" 命令統(tǒng)計(jì)的pid號是一樣的:
2.3 知道了apache 的pid 號,還有在什么文件查看內(nèi)存使用情況,就可以寫python 腳本了,先統(tǒng)計(jì)所有的pid號:
#!/usr/bin/env??python"""filename:?10_httpd.py"""from?subprocess??import?Popen,?PIPE????#?因?yàn)橐獔?zhí)行l(wèi)inux?的命令,需要使用subprocess?模塊"""定義一個(gè)函數(shù),用于獲取所有的httpd?的pid號""" def??getPid():p?=?Popen(["pidof",?"httpd"],?stdout=PIPE,?stderr=PIPE)pids?=?p.stdout.read().split()??#通過管道,讀出的結(jié)果是字符串,然后用split分割,保存在一個(gè)listreturn?pidsif??__name__?==?"__main__"?:print?getPid()先測試一下,執(zhí)行python 10_httpd.py,輸出的結(jié)果,如圖,輸出了全部httpd 的pid 號。
繼續(xù)完善腳本,統(tǒng)計(jì)所有httpd 的內(nèi)存,需要通過/proc/pid/status 文件:
#!/usr/bin/env??python"""filename:?10_httpd.py"""from?subprocess??import?Popen,?PIPE????#?因?yàn)橐獔?zhí)行l(wèi)inux?的命令,需要使用subprocess?模塊 import??os"""定義一個(gè)函數(shù),用于獲取所有的httpd?的pid號""" def??getPid():p?=?Popen(["pidof",?"httpd"],?stdout=PIPE,?stderr=PIPE)pids?=?p.stdout.read().split()??#通過管道,讀出的結(jié)果是字符串,然后用split分割,保存在一個(gè)listreturn?pids""" 定義一個(gè)函數(shù),統(tǒng)計(jì)所有httpd?進(jìn)程的內(nèi)存 參數(shù):pids?是getPid()?返回的列表 """ def?parsePidFile(pids):sum?=?0for?i?in?pids:fn?=?os.path.join('/proc',?i,??'status')?#返回status文件的絕對路徑with?open(fn)?as?fd:for?line?in?fd:???if?line.startswith('VmRSS'):???#遍歷文件,找到以"VmRSS"開頭的行mem?=?int(line.split()[1])?#以空格分割,返回第二部分,內(nèi)存數(shù)sum?+=?membreakreturn?sum""" 函數(shù),打開"/proc/meminfo",獲取總的內(nèi)存 """ def???total_mem(fn):with?open(fn)?as?fd:for?line?in?fd:if?line.startswith("MemTotal"):total_memory?=?int(line.split()[1])return?total_memoryif??__name__?==?"__main__"?:pids?=?getPid()sum_mem?=?parsePidFile(pids)total_memory?=?total_mem("/proc/meminfo")?print??"Httpd?sum?memory?is:?%s?KB"?%?sum_memprint??"Mmeory?percent:?%.2f%%"?%?((sum_mem/float(total_memory))*100)測試一下,執(zhí)行 python 10_httpd.py, 輸出的結(jié)果:
2.4 測試
安裝一個(gè)elinks 工具,訪問apache 看看內(nèi)存百分比是否會增高,
yum install elinks
用elinks 訪問,模擬測試都是在本機(jī)進(jìn)行:
elinks ? http://localhost
然后再運(yùn)行python 10_httpd.py, 輸出結(jié)果:
只要,apache 有訪問,占用的內(nèi)存就會升高。
轉(zhuǎn)載于:https://blog.51cto.com/hellocjq/1864082
總結(jié)
以上是生活随笔為你收集整理的python统计httpd 进程的内存占用百分比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015调试时没有启动IIS Exp
- 下一篇: websocket python爬虫_p