CPU消耗过高的问题

一、现象:

压测过程中,发现应用服务器的CPU使用率比较高(>80%或者>90%)

一般分为两种情况:

1、接口的性能非常好,比如响应时间<10ms,tps很高,此事CPU使用率高是正常的,不需要优化

2、接口性能不好,比如响应时间>200ms,tps很低,此时考虑优化

 

二、找到占用CPU比较高的线程

方法一:

1、输入top命令,找到占用CPU最高的进程号

2、输入命令:top -p pid

 3、按H,出现进程的线程,默认按照CPU从高到低排序

 4、把线程pid转换成十六进制,根据转换的十六进制去dump文件中找到对应nid的线程号,对代码进行分析

printf "%x\n" 1512:把十进制的1512转换成十六进制

 总结:该方法适用于有固定的一个或几个线程占用CPU比较高

 

 二、jprofiler分析:

1、在windows(本机)上安装jprofiler客户端

 

 windows安装步骤:双击-下一步(略)

2、生成客户端秘钥:双击KeyGen.exe-->点击Generate

 

3、Linux应用服务器上安装jprofiler服务端

3.1 将jprofiler_linux_11_0.rpm上传至linux服务器上,并添加可执行权限

 3.2 执行命令rpm -ivh jprofiler_linux_11_0.rpm安装jprofiler,默认安装在/opt/jprofiler11目录下

 3.3 在tomcat/bin/catalina.sh文件配置jvm参数的地方添加

  -agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait

 4、jprofiler使用步骤

4.1 双击JProfiler客户端-->StartCenter-->NewSession-->New Remote Integration

 4.2 选择监控的系统,点击Next

 4.3 选择JVM版本信息:

 4.4 选择是否等待jprofiler界面

  4.5 配置监控系统的ip

 4.6 配置jprofiler的目录

  4.7 配置jprofiler的端口号

 4.8 Next-->Finish

 

 

 4.9 选择模式

 

 

 5、点击Detach,断开连接

 6、点击StartCenter,选择之前建立的连接,再次监控

 7、点击CPU views-->点击Hot Spots-->点击record CPU,即可查看哪个类下的哪个函数占用CPU时间较长

 

 

 三、CPU消耗过高可能的原因:

1、使用了复杂的算法,比如加密、解密

2、压缩、解压、序列化等操作

3、代码中有Bug,比如死循环

 

posted @ 2021-11-22 17:13  小红帽与大灰狼  阅读(749)  评论(0编辑  收藏  举报