有时候我们需要分析服务器的load average为何异常的高,然而跟踪这个问题,一般都会打开top命令查看进程或者线程信息。有时候这个异常只在特定的时间段内出现,比如服务的高峰期。还有服务的进程中有N多个线程,你用肉眼根本没法看全。这个时候,就需要将top的信息保存成文件来分析了。
top -b -n 2400 -H -p xxxx > xxxx.log
这里的xxxx是要跟踪的进程号,我这里就以跟踪某个特定的服务为例了。
上面这句的意思就是 -b 能突破终端长宽的限制,显示这个进程的全部线程。
-n 是刷新多少次, 我的top每3s刷新一次,那么2400次的时间就是 2个小时了。
-H -p xxxx 就是跟踪xxxx这个进程中的线程了
这些信息保存成了xxxx.log
等到2小时后,就有xxxx.log这个日志了。
我们来看xxxx.log这个日志的格式,就是2400个top信息累加成的一个文件。我们用python脚本按行分析(简单粗暴,但耗时)

然后按行分析,可以提取出load average 各线程所占用的cpu等信息
python 脚本位置:
https://github.com/Tomasmule2015/AnalyseTopFile.git
直接执行python analysetopfile.py
在analysetopfile.py 中更改需要分析的log文件,以及想要生成的db 名称。

生成的db用SQLiteStudio 打开,然后导出表格,再用表格的数据做成折线图,这样就有这个效果了:

网友评论