CPU load飙高排查---线程级别
2016-04-26 20:28
661 查看
进程级别的逗号处理,直接top就可以了.但是线程级别的CPU load飙升处理起来相对而已比较麻烦.
好, 直接上脚本:
现在我们就来拆解其中的原理,以及说明下类似脚本的适用范围。
1.使用top命令查看飙高的java进程,记录pid
2.通过jstack命令将java的线程栈输出,保留现场 jstack -l 30142 > 30142.stack
3.找到当前CPU使用占比高的线程,通过 ps H -eo user,pid,ppid,tid,time,%cpu –sort=%cpu
USER:进程归属用户,PID:进程号,PPID:父进程号,TID:线程号
%CPU:线程使用CPU占比(这里要提醒下各位,这个CPU占比是通过/proc计算得到,存在时间差)
4.合并相关信息,通过PS拿到了TID,可以通过进制换算10-16得到jstack出来的JVM线程号
typeset nid=”0x”(echo"(echo "line”|awk ‘{print $1}’|xargs -I{} echo “obase=16;{}”|bc|tr ‘A-Z’ ‘a-z’)
5.最后再将ps和jstack出来的信息进行一个匹配与合并。终于,得到我们最想要的信息
好, 直接上脚本:
#!/bin/ksh typeset top=${1:-10} typeset pid=${2:-$(pgrep -u $USER java)} typeset tmp_file=/tmp/java_${pid}_$$.trace $JAVA_HOME/bin/jstack $pid > $tmp_file ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu --no-headers\ | tail -$top\ | awk -v "pid=$pid" '$2==pid{print $4"\t"$6}'\ | while read line; do typeset nid=$(echo "$line"|awk '{printf("0x%x",$1)}') typeset cpu=$(echo "$line"|awk '{print $2}') awk -v "cpu=$cpu" '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}' $tmp_file done rm -f $tmp_file
现在我们就来拆解其中的原理,以及说明下类似脚本的适用范围。
1.使用top命令查看飙高的java进程,记录pid
2.通过jstack命令将java的线程栈输出,保留现场 jstack -l 30142 > 30142.stack
3.找到当前CPU使用占比高的线程,通过 ps H -eo user,pid,ppid,tid,time,%cpu –sort=%cpu
USER:进程归属用户,PID:进程号,PPID:父进程号,TID:线程号
%CPU:线程使用CPU占比(这里要提醒下各位,这个CPU占比是通过/proc计算得到,存在时间差)
4.合并相关信息,通过PS拿到了TID,可以通过进制换算10-16得到jstack出来的JVM线程号
typeset nid=”0x”(echo"(echo "line”|awk ‘{print $1}’|xargs -I{} echo “obase=16;{}”|bc|tr ‘A-Z’ ‘a-z’)
5.最后再将ps和jstack出来的信息进行一个匹配与合并。终于,得到我们最想要的信息
相关文章推荐
- 如何获取到文件的创建时间,修改时间等参数
- java synchronized类锁,对象锁详解(转载)
- opencv3.1.0 环境配置
- linux定时任务crond那些事! 【转】
- 树的子结构
- Problem M
- c++作业4
- sockaddr和sockaddr_in的区别
- HDU 5661 Claris and XOR
- 数据库连接池简单设计
- 小笨狼与LLDB的故事
- Android ADB工具
- C++作业4
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- HDU 5179 beautiful number 数位dp
- 算法训练 调和数列问题
- JAVA——多线程举例
- #leetcode#121. Best Time to Buy and Sell Stock
- Efficient Graph-Based Image Segmentation
- 用程序获取本机IP地址,mac地址