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