一招教你成为大内密探:诊断优化找出消耗CPU性能的内鬼

每次提起性能测试,都是开始于脚本、压力,然后各种监控,最后的最后就是分析。每次到了最后一个环境,所有大牛都说是一个很复杂的过程一两句话说不清楚。让人陷入了无尽的遐想~~~~~。

今天,测试就告诉你如何找到Java消耗CPU的进程是怎么被找到的。

传统的手段

当遇见CPU性能飙升到接近100的时候,首先需要进入对应的服务器,然后通过如下一连串的动作找到最耗资源的罪魁祸首。

top发现最好是的进程

在shell界面中,输入top,找到最消耗CPU的那个Java进程。记录下PID号码。

然后通过:

top -H -p pid

命令查看对应PID进程下的线程,找到最耗资源的线程的PID。将其通过shell转成十六进制:

printf ”%x\n“ pid
%x,表示十六进制,\n是换行

应用jstack针对上面耗时的线程进行分析

jstack PID(十六进制)1> xxx.tmp

然后打开xxx.tmp文件,搜索PID(十六进制)号码,下面的堆栈就是这个线程打出来的。排查问题就可以从这些堆栈信息开整找到问题。

一个一劳永逸的工具

show-busy-java-threads用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。

GitHub地址:https://github.com/oldratlee/useful-scripts

在服务器端,克隆项目: git clone git://github.com/oldratlee/useful-scripts.git

cd useful-scripts

然后就可以看到了show-busy-jaa-threads工具了。其中,该Github仓库有一个release发布分支,里面包含的都是功能稳定的脚本,建议使用的时候切换到该分支。方法如下:

# 使用Release分支的内容
git checkout release
# 更新脚本
git pull

进入userful-scripts目录后,输入 ./show-busy-java-threads就可以使用这个工具进行上述消耗CPU的优化分析了。其他show-busy-java-threads工具的用法如下:

show-busy-java-threads

# 从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈



# 缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便

# 当然你可以手动指定要分析的Java进程Id,以保证只会显示出那个你关心的那个Java进程的信息

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



show-busy-java-threads -c <要显示的线程栈数>



show-busy-java-threads <重复执行的间隔秒数> [<重复执行的次数>]

# 多次执行;这2个参数的使用方式类似vmstat命令



show-busy-java-threads -a <运行输出的记录到的文件>

# 记录到文件以方便回溯查看



show-duplicate-java-classes -S <存储jstack输出文件的目录>

# 指定jstack输出文件的存储目录,方便记录以后续分析



##############################

# 注意:

##############################

# 如果Java进程的用户 与 执行脚本的当前用户 不同,则jstack不了这个Java进程

# 为了能切换到Java进程的用户,需要加sudo来执行,即可以解决:

sudo show-busy-java-threads



show-busy-java-threads -s <指定jstack命令的全路径>

# 对于sudo方式的运行,JAVA_HOME环境变量不能传递给root,

# 而root用户往往没有配置JAVA_HOME且不方便配置,

# 显式指定jstack命令的路径就反而显得更方便了



# -m选项:执行jstack命令时加上-m选项,显示上Native的栈帧,一般应用排查不需要使用

show-busy-java-threads -m

# -F选项:执行jstack命令时加上 -F 选项(如果直接jstack无响应时,用于强制jstack),一般情况不需要使用

show-busy-java-threads -F

# -l选项:执行jstack命令时加上 -l 选项,显示上更多相关锁的信息,一般情况不需要使用

# 注意:和 -m -F 选项一起使用时,可能会大大增加jstack操作的耗时

show-busy-java-threads -l



# 帮助信息

$ show-busy-java-threads -h

Usage: show-busy-java-threads [OPTION]... [delay [count]]

Find out the highest cpu consumed threads of java, and print the stack of these threads.



Example:

 show-busy-java-threads       # show busy java threads info

 show-busy-java-threads 1     # update every 1 second, (stop by eg: CTRL+C)

 show-busy-java-threads 3 10  # update every 3 seconds, update 10 times



Output control:

 -p, --pid <java pid>      find out the highest cpu consumed threads from the specified java process,

                           default from all java process.

 -c, --count <num>         set the thread count to show, default is 5.

 -a, --append-file <file>  specifies the file to append output as log.

 -S, --store-dir <dir>     specifies the directory for storing intermediate files, and keep files.

                           default store intermediate files at tmp dir, and auto remove after run.

                           use this option to keep files so as to review jstack/top/ps output later.

 delay                     the delay between updates in seconds.

 count                     the number of updates.

                           delay/count arguments imitates the style of vmstat command.



jstack control:

 -s, --jstack-path <path>  specifies the path of jstack command.

 -F, --force               set jstack to force a thread dump.

                           use when jstack <pid> does not respond (process is hung).

 -m, --mix-native-frames   set jstack to print both java and native frames (mixed mode).

 -l, --lock-info           set jstack with long listing. Prints additional information about locks.



cpu usage calculation control:

 -d, --top-delay           specifies the delay between top samples, default is 0.5 (second).

                           get thread cpu percentage during this delay interval.

                           more info see top -d option. eg: -d 1 (1 second).

 -P, --use-ps              use ps command to find busy thread(cpu usage) instead of top command,

                           default use top command, because cpu usage of ps command is expressed as

                           the percentage of time spent running during the entire lifetime of a process,

                           this is not ideal.



Miscellaneous:

 -h, --help                display this help and exit.

其实优化是性能测试的根本目标,找到问题后分析问题才是关键,通过各种手段找到更详细的问题,找到更多的数据和RD一起分析。

结语:

最后跟大家推荐一个学习资料分享群:175317069,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!

人生是一个逆水行舟的过程,不进则退,咱们一起加油吧!

    原文作者:TeacherAilie
    原文地址: https://www.jianshu.com/p/3d188a4f95cf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞