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,比如死循环