文章目录

  • 一、背景
  • 二、程序占用CPU过高排查方法
  • 2.1、方法一:常规方法排查
  • 2.1、方法二:使用工具排查
  • 三、JVM性能监控工具
  • 四、总结
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?



一、背景

对于开发或运维来说,CPU使用率或负载过高或多或少会经常遇到,不熟悉定位流程的同学可能会手忙脚乱,这里介绍两种方法来定位CPU过高问题。


二、程序占用CPU过高排查方法

2.1、方法一:常规方法排查

1、我们通过top命令查看当前CPU消耗过高的进程是哪个,从而得到进程id

CPU JAVA gc时 飙升 cpu过高java_ssh


2、通过top -Hp 来查看该进程中有哪些线程CPU过高,一般超过80%就是比较高的,80%左右是合理情况。

CPU JAVA gc时 飙升 cpu过高java_CPU JAVA gc时 飙升_02


3、通过该线程id的十六进制表示在jstack日志中查看当前线程具体的堆栈信息。

# 拿到线程ID的16进制之后,就可以从jstack中查找具体是对应的线程
[root@localhost ~]# printf "%x\n" 25019 
61bb
[root@localhost ~]# printf "%x\n" 25020
61bc

# 查看对应的线程栈,分析问题
[root@localhost ~]# jstack 25007 | vim +/61bb -
[root@localhost ~]# jstack 25007 | vim +/61bc -

如下图所示:

CPU JAVA gc时 飙升 cpu过高java_docker_03

2.1、方法二:使用工具排查

1、工具下载

# 1、方法一:github下载地址
wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release-2.x.zip
unzip release-2.x.zip

2、工具用法

#show-busy-java-threads -p <指定的Java进程Id>

[root@localhost bin]# ./show-busy-java-threads -p 25007

如下图所示:

CPU JAVA gc时 飙升 cpu过高java_ssh_04


三、JVM性能监控工具

1、top指令:查看当前所有进程的使用情况,CPU占有率,内存使用情况,服务器负载状态等参数。除此之外它还是个交互命令,使用可参考完全解读top。

2、jps:与linux上的ps类似,用于查看有权访问的虚拟机的进程,可以查看本地运行着几个java程序,并显示他们的进程号。当未指定hostid时,默认查看本机jvm进程。

3、jinfo:可以输出并修改运行时的java 进程的一些参数。

4、jstat:可以用来监视jvm内存内的各种堆和非堆的大小及其内存使用量。

5、jstack:堆栈跟踪工具,一般用于查看某个进程包含线程的情况。

6、jmap:打印出某个java进程(使用pid)内存内的所有对象的情况。一般用于查看内存占用情况。

7、jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器的jvm进程。


四、总结

1、CPU过高
可能是系统频繁的进行Full GC,导致系统缓慢。而我们平常也肯能遇到比较耗时的计算,导致CPU过高的情况。

2、Full GC次数过多
相对来说,这种情况是最容易出现的,尤其是新功能上线时。对于Full GC较多的情况,其主要有如下两个特征:线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。

再次确认gc信息,查看gc time等信息,jstat -gcutil 25007 1000 100

CPU JAVA gc时 飙升 cpu过高java_docker_05