背景
最近工作中要做一个优化,将定时任务的调度频率从1min/次提升到30s/次,相当于频率提高一倍。这就需要我从系统性能、任务处理时间等方面进行分析了。
数据准备
首先是需要对该场景下的调度数据进行分析。我的任务场景是比较简单的,就是每次定时调度批量处理某些任务。我的数据准备也是比较简单的,只需要观察此时线上每次调度时会处理的任务数,再加上后续业务上会扩张的任务数量,对任务数据量进行线下mock,然后分析每次任务执行时的CPU占用率以及任务执行的总时间就可以了。
工具准备
分析CPU性能有很多的工具,开发和线上的机器都是Linux的RedHat系列,所以我使用的是nmon和他的解析工具nmon Analyser
第一步在开发机上安装nmon性能监控工具:
sudo yum install nmon
验证安装成功,输入nmon命令进入性能监控控制台,如下:
工具使用
我先开始采集机器性能数据(每一秒采集一次数据,共采集5分钟的数据)
nmon -s 1 -c300 -f -m /home/admin/tmp &
-s1:每一秒采集一次数据;
-c300:采集300次,即为采集5分钟的数据;
-f:生成的数据文件名中包含文件创建的时间
-m:生成的数据文件的存放目录
&:后台运行
接着开始触发定时调度,定时任务触发完,观察nmon数据是否采集结束,可以通过观察/home/admin/tmp下的nmon文件大小是否还在变大来确定。nmon文件生成完毕后,可以通过测试哥哥教我的命令在文件生成的目录运行命令
python -m SimpkleHttpServer 2345
接着在本地浏览器中输入"机器域名:2345"的端口号,就可以将.nmon文件下载下来了。
下载分析工具nmon Analyser,下载下来是一个excel文件,选择启用宏并打开Analyser的sheet,点击Analyze nmon data,将download的
.nmon文件引入。

稍等片刻,我们就可以看到一系列的性能数据了,类似如下图(并不是我的nmon数据图)。
在我的数据里面,CPU使用率高达100%,所以需要进一步分析CPU占用率高的进程是哪一个了。
分析命令使用
可以使用top命令去观察CPU占用量大的进程是哪一个,也是一秒钟统计一次,可以得到类似的数据文件。
top -d 1 -b > /home/admin/tmp/top.txt
而我的top文件告诉我进程占用量最高的是Java进程。命令查询的结果可以和我JAVA应用服务所对应。
jps -v
所以确定了造成CPU占用率过高的原因确实是应用JAVA服务,接着需要进一步确认是JAVA进程中的哪一个线程造成的。可以通过命令分析线程的CPU利用率
top -Hp pid -d 1 -b > /home/admin/tmp/top2.txt
这时候需要将图中的线程号换算成16进制数据,通过命令jstack来分析是哪些线程造成的
jstack pid | grep 十六进制线程号
其中C2 CompilerThread0这个线程网上的说明有很多JAVA 进程异常分析 - CPU、内存,剩下的确实都是任务调度的线程 。
因为开发机器的性能和线上机器的性能是不能比拟的,所以在做性能分析的时候,要申请一台和线上机器性能一样的机器,当我们换到和线上机器配置的开发机器时,CPU的利用率从最高100%降到了最高20%,说明线上机器的性能是可以支撑定时调度批量触发任务的。
任务处理时间
除了要看机器的性能外,还需要看在一次调度时间内,是否所有的任务都可以被执行完,用以判断是否会存在积压的情况。
每次触发共有6种类型的任务会被触发,所以需要查询线上这6种类型的任务的一次执行时间,并且每次定时任务触发时各个类型的任务所占的比例,计算时根据线上机器数与CPU数计算整体的任务完成时间。
上下游业务分析
在机器性能和任务处理时间都满足的情况下,本以为可以完成这次调拨频率提高的优化,结果被组里的老司机告知,有一种任务对应的下游业务只能在每分钟的第40s进行处理。
结论
最后因为下游业务接口处理的原因,不能执行频率提高的优化。
总结
初探的过程主要是数据准备,工具准备以及压测,除了从机器的性能上,还要结合业务场景进行分析,在整个过程中主要使用了如下的工具和命令进行分析
1.nmon -s 1 -c300 -f -m /home/admin/tmp &
2.top -Hp 72474 -d 1 -b > /home/admin/tmp/top72474.txt
3.top -d 1 -b > top1.txt
4.python -m SimpleHTTPServer 2345
5.jps -v
6.jstack 72474
7.jinfo -flag CICOmpilerCount 72474
网友评论