一、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("redis.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,查找原因中…
-
最终结果