Docker容器cpu占用高问题排查方案之一

针对Java应用,我结合我们的docker环境写了一个容器cpu飙升问题精确排查步骤(注:有的镜像过于精简,一些命令工具是缺失的,所以要想实施以下方案,容器中的linux常用命令安装是需要解决的)

容器必备命令

top  -Hp   jvm进程ID      找到cpu占用最高的 jvm 线程ID

jstack    jvm进程ID         导出java线程栈信息

printf  “%x\n”  线程ID     将10进制数字转换成16进制数

下面是我在dev环境的测试情况

1、top命令查出Java进程ID,如下图为 54

d0c4f357a2cf56b711138d9d0e8b8a04.png

2、查出java进程内 哪个线程ID占用cpu最高

top  -Hp  54

如下图最高的是线程ID为78的线程

b575e5d4b563bed5a8cfa344452d502b.png

3、将线程ID转换成16进制

printf  "%x\n"   78

f81a70e4bb0eab5148ed4710c0269116.png

4、抓取对应线程堆栈信息

jstack 进程号 | grep nid=0x+16进制线程号 -A 100

jstack  54   | grep  nid=0x51  -A  100

如下图就找到了最高的线程堆栈信息,进一步可以找到程序里的类和方法信息

4f69683142d49d3f243b6f02c781b671.png

5、下面自动化脚本

echo '----------begin----------'
count=1


if [[ x$1!=x ]]; then
  #statements
    count=$1;
fi


jvm_pid=$(top -n 1 | grep java | awk '{print $2}' )
echo  'jvm pid = '$jvm_pid


for i in $(seq 1 $count); do
  #statements
  max_cpu_tid=$( top -Hp $jvm_pid  -n 1  | awk 'NR==8' | awk '{print $2}' )
  echo 'cpu max java thread tid = '$max_cpu_tid
  tid16=$(printf "%x\n"  $max_cpu_tid)
  echo  'tid16 = '$tid16
  jstack  $jvm_pid | grep  nid=0x$tid16  -A  100
  echo '---------------------------------------------------------'
  sleep 1s
done


echo '----------end----------'
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕哥架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值