性能问题之CPU消耗高


现象

压测过程中,发现应用服务器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占用高的地方