随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题;但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问题:
OS 现象:
常见问题以及诊断方法:
jvisualvm 里面的 CPU Profiler
连到 JVM 后,到 Sampler, Click #CPU in the VisualVM and start your request; after complete the request, click #STOP in the VisaulVM
1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852
Name PID CPU%
java 614852 23.9
java 450806 20.5
2. 使用命令 ps -mp <PID> -o THREAD 定位 CPU 使用高的线程 TID
比如下显示线程 (TID)11219165 消耗了 22% CPU. 把 11219165 换成 16 进制得到 AB30DD
ps -mp 614852 -o THREAD
USER PID PPID TID S CP PRI SC WCHAN F TT BND COMMAND
wc90 614852 581756 - A 222 60 49 * 242001 - - xxxxxxxxxxxx
- - - 4751559 R 20 95 1 - 400000 - - -
- - - 11219165 R 22 96 0 - 400000 - - -
3. 获得 javacore 文件
通过命令 kill -3 <pid>, 比如 kill -3 614852
硬盘上 Java 工作目录 (一般是启动目录)会产生 javacore.20150507.163756.643532.0004
4. 搜索 TID, 比如 会得到线程的 Stack Trace, 然后可以定位消耗 CPU 的代码
1. 和上面类似,不过使用下面命令得到消耗 CPU 的 进程以及里面的线程
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
Or
top -H -p <pid>
2. 使用下面命令抓取 进程 thread dump, 然后结合上面的 PID (需要换成 16 进制),在 thread dump 里面搜索就可以找到
Jstack <pid> > jstack.txt