CPU和线程 #
top #
top命令可以用来找出使CPU飙到100%的罪归祸首。
1、使用 top
命令查看进程列表
以上输出结果中PID=382的进程占用CPU最高。
2、使用 top -Hp <pid>
查看进程内部的线程运行状态
以上输出结果中PID=405的线程最为忙碌。
3、通过printf %x <pid>
命令将线程ID转换为Java使用的16进制ID。
4、通过jstack
工具找到对应的Java线程。
为了查找方便,可以使用
grep
命令只返回后几行记录。jstack <pid> | grep -A <n> <thread_name>
async-profiler #
官网: https://github.com/jvm-profiling-tools/async-profiler
async-profilter 支持CPU(默认)、alloc(内存)、锁、wall和itimer。
CPU采样 #
开启/关闭采样
./profiler.sh start <pid>
./profiler.sh stop <pid>
自动采样
./profiler.sh -d <second> <pid>
生成Html格式火焰图文件。不指定文件路径时默认输出在控制台。
./profiler.sh -d <second> -f <html_filename> [--title <title_name>] <pid>
CPU火焰图 #
火焰图本质是通过Linux的perf命令来生成的,该命令会返回CPU正在执行的函数名和调用栈。默认每秒采样99次,然后结果进行排列后就产生了火焰图。
图表说明:
- 颜色无关紧要。
- y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部是正在执行的函数,下方都是它的父函数。
- x 轴表示抽样数,按字母顺序排列。宽度越宽,调用次数越多。
- 如果火焰图最上面存在大平顶,则表示该函数可能存在性能问题。
火焰图可以进行交互。在某一层点击后,火焰图会水平放大,并显示该层的详细信息。