现象
压测过程中,发现应用服务器CPU使用率比较高(80%)
这种现象产生的原因,一可能是接口性能非常好,比如响应时间10ms,TPS很高,此时CPU使用率很高是正常的,不需要做代码层面的优化;还有一种情况就是接口性能不好,可能响应时间>200ms,TPS很低,这种情况下就需要定位问题并做优化了。
CPU消耗高的可能原因:
1、使用了复杂的算法,比如加密解密;
2、压缩、解压缩、序列化等操作;
3、代码bug,比如死循环
案例
某接口测试结果如下:
从上面的结果来看,平均时间响应时间较长,TPS也不高,这种情况下很可能是存在问题的。
问题分析
1、通过top命令查看占用CPU高的进程pid,然后执行top -p pid,手动输入H,可以查看应用程序内部的线程占用资源情况:
注:上图中的pid对应的应该是堆栈日志中的nid,对应的是系统线程
2、将第1中占用CPU高的线程pid转成16进制
(1)可以通过linux命令将十进制转成16进制: printf "%x" 2662
(2)进制在线转换:https://tool.lu/hexconvert/
3、用jstack获取堆栈日志
4、用第2步中获取的16进制去堆栈日志中查找,链路比较长且状态是runnable的进程,并查看日志中是否有业务代码,这样应该可以找到CPU占用高的地方