有時服務器運維中,某些程序員的應用發布后完全不管CPU和內存的使用率,只覺得代碼能運行就行了,這樣給我們運維人員經常造成困擾;
比如我在zabbix平台中就經常監測到凌晨1~3~5點時候突然CPU飆升到50~93%,win和linux系統都沒有比較方便的定時監控指定進程的方法,經過長時間的尋解、修改和測試,如下python代碼可以實現根據pid定時監控CPU使用率和內存使用率,並輸出到.csv文件,windows和linux平台皆可用:
# 本程序可以實現自動識別CPU內核數,然后根據輸入的進程pid號,來計算出多核的CPU使用率和內存使用率,並將監控結果同時打印到屏幕和文件中。
import sys
import time
import psutil
# 查詢顯示當前系統的CPU內核和顆數等信息
print('邏輯CPU個數:' + str(psutil.cpu_count())) # 取多內核平均值時應除以物理內核比較近似
print('物理CPU個數:' + str(psutil.cpu_count(logical=False)))
# print('當前可用CPU個數:' + str(len(psutil.Process().cpu_affinity())))
# 將輸入的參數pid號保存到列表sys.argv中,若輸入的值小於2位則中斷退出並提示
if len(sys.argv) < 2:
print("輸入pid值無效,請按示例輸入,例:“python CPU_Analysis_Python.py pid號碼”")
sys.exit()
# 通過psutil模塊,獲取並保存pid對應的進程對象
pid = int(sys.argv[1])
p = psutil.Process(pid)
# 監控進程相關的CPU和內存使用率數據,寫入存儲
interval = 1 # 設置監控的循環間隔時間
with open("CPU_Analysis_pid" + str(pid) + "_" + p.name() + ".csv", "a") as f: # 創建記錄輸出文檔,格式為.csv
f.write(" 時間 , CPU使用率(%), 內存使用率(%) \n") # 寫入標題——>.csv文檔中
while True:
with open("CPU_Analysis_pid" + str(pid) + "_" + p.name() + ".csv", "a") as f: # 添加監控記錄輸出文檔
current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime(time.time()))
# 計算CPU使用率(%) = 所有核心使用率之和 / (1s * 物理內核數量), 參數interval的值為獲取當前CPU使用率的時間間隔
cpu_percent = round(((p.cpu_percent(interval=1) / 100) / psutil.cpu_count(logical=False)) * 100, 2)
mem_percent = p.memory_percent()
line = current_time + ',' + str(cpu_percent) + ',' + str(mem_percent)
print('時間:' + current_time + ', CPU使用率:' + str(cpu_percent) + ', 內存使用率:' + str(mem_percent)) # 輸出控制台,可注銷掉
f.write(line + "\n")
time.sleep(interval)