一、windows監控進程
-
目的:在windows下監控某一個進程5天的內存使用,查看是否有內存泄露
-
實現:考慮過各種工具,最後選擇批處理實現
-
代碼:
代碼實現監控redis進程,每隔1分鐘將tasklist查到的內存使用情況存入redis.txt文件中@echo off rem 這段用來將腳本放入後臺運行 if "%1"=="hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit :CmdBegin rem 這段用來從tasklist中查找到redis-server.exe這行,然後提取第5列,分隔符是空格,最後將日期和時間及查到的內存數輸出到redis.txt文件中 :top for /f "tokens=5 delims= " %%a in ('tasklist /nh ^|findstr /i redis-server.exe') do echo %date% %time% %%a >> redis.txt rem 使用ping來實現每隔60s ping -n 60 127.0.0.1>nul goto top
-
得到的數據
2019/05/23 週四 11:27:44.44 381,064 2019/05/23 週四 11:28:43.98 401,224 2019/05/23 週四 11:29:43.53 413,752 2019/05/23 週四 11:30:43.06 378,804 ...
二、數據圖表展示
-
數據展示
將獲得的數據展示出來,使用python的panda庫清洗和格式化數據,最終用matplotlib來展示數據import numpy as np from pandas import Series,DataFrame import pandas as pd import matplotlib.pyplot as plt # 設置顯示樣式 plt.style.use("ggplot") # 設置中文編碼 plt.rcParams["font.sans-serif"] = "KaiTi" # 讀取txt文件,header=None表示沒有表頭,header=0表示第一行是表頭,encoding編碼,sep是分隔符 r'\s+'表示空白符 data=pd.read_table("collector.txt",header=None, encoding='gbk',sep=r'\s+') # 刪除索引爲1的列,drop默認刪除行,axis = 1修改爲刪除列 data=data.drop(1, axis = 1) # 將索引爲0和2的兩列連接一起 data['日期時間']=data[[0,2]].apply(lambda x:' '.join(x), axis=1) # 刪除索引爲0(日期)和索引爲2(時間)的兩列 data=data.drop(0, axis = 1) data=data.drop(2, axis = 1) # 將日期時間格式化 data['日期時間']=pd.to_datetime(data['日期時間'], errors='coerce') # 對數字進行格式化,刪除中間的,號 data[3]=data[[3]].apply(lambda x: x.str.replace(',', ''),axis=1) # 將數字格式化,遇到不能轉的,有三種選項,raise 報錯(默認) ignore 忽視 coerce 轉成NAN非數字 NAT非時間 data[3]=pd.to_numeric(data[3], errors='coerce') # 將KB轉成MB data[3]=data[[3]].apply(lambda x: x/1024, axis=1) plt.plot(data['日期時間'], data[3]) plt.title('redis進程內存使用') plt.xlabel('時間') plt.ylabel('內存(M)') plt.show()
注:數據中有一段數據並沒有提取到內存數,只有K,查找原因中…
-
最終結果