Java程序CPU异常监控bash脚本

本文介绍了如何编写一个bash脚本来监控Java程序的CPU使用情况,包括获取PID、计算CPU和内存占用,以及在CPU使用率过高时执行jstack和arthas进行深入分析。脚本还包含了处理极端情况如重启进程和生成dump文件的功能。
摘要由CSDN通过智能技术生成

Java程序CPU异常监控bash脚本

契机

思路

#使用jps获取java程序,忽略jps本身
jps -lv | grep java | grep -v Jps | awk '{print $1}'

#pid拿到cpu占用率
top -b -n 1 -p $pid | grep $pid | awk '{print $9}'

#jstack一下
jstack $pid > "/xxx.txt"

#非交互式的执行arthas脚本
java -jar arthas-boot.jar --select ./$jar_name -f .xx.sh

#arthas里面没有sleep程序,无法完成火焰图的等待,取巧使用dashbord,下面表示等待15s
dashboard -n 5 -i 3000

#dump文件
jmap -dump:format=b,file=/mnt/$pid.hprof $pid

成品

请添加图片描述

运行命令

nohup ./monitor.sh >> ./monitor.log 2>&1 &

主脚本:monitor.sh

#!/bin/bash

while true
do
    echo "$(date): 监控java"
    timestamp=$(date +%Y%m%d%H%M%S)
    # 获取所有名字中包含 "java" 进程的 PID,不包含jps
    for pid in $(jps -lv | grep java | grep -v Jps | awk '{print $1}')
    do
        # 获取每个进程的 CPU 和内存使用率
        cpu=$(top -b -n 1 -p $pid | grep $pid | awk '{print $9}')
        mem=$(top -b -n 1 -p $pid | grep $pid | awk '{print $10}')

        # 获取jar包名
        jar_name=$(jps | grep $pid | awk '{print $2}')

        echo "$(date): PID $pid - CPU : $cpu - Memory : $mem - 应用: $jar_name"

        # 如果 CPU 使用率超过 100%, 打印jstack arthas火焰图 arthas线程
        if [ $(echo "$cpu > 100" | bc) -eq 1 ]; then
            echo "$(date):  $jar_name , PID $pid cpu占用 $cpu 立即打印jstack arthas火焰图 arthas线程"
             cd /root/prod

             echo "$(date): 生成jstack文件 $jar_name $pid"
             jstack $pid > "/mnt/${jar_name}_${pid}_${timestamp}_jstack.txt"

             echo "$(date): 生成arthas文件 $jar_name $pid"
             java -jar arthas-boot.jar --select ./$jar_name -f ./arthas-profiler.sh
             mv /mnt/thread10.txt "/mnt/${jar_name}_${pid}_${timestamp}_thread10.txt"

        fi

        # 如果 CPU 使用率超过 300%,则结束该进程并重启,忽略xxxx
        if [ $(echo "$cpu > 300" | bc) -eq 1 ] && [[ "$jar_name" != *"xxxx"* ]]; then
            echo "$(date):  $jar_name , PID $pid cpu占用 $cpu 立即重启,并且打印dump文件"
             cd /root/prod
             #生成dump文件
             echo "$(date): 生成dump文件 $pid"
             jmap -dump:format=b,file=/mnt/$pid.hprof $pid
             #重启
             ./deploy.sh restart $jar_name
        fi

    done

    # 等待60秒
    echo "$(date): -----------------------------------------------------------------------------"
    sleep 60
done

副脚本:arthas-profiler.sh

thread -n 10 >> /mnt/thread10.txt
profiler start
dashboard -n 5 -i 3000
profiler stop
stop

总结

  • arthas无法使用sleep命令
  • dump文件很难分析cpu占用,主要靠火焰图,top,dashboard
  • 这里是瞬间cpu占用,60秒一次一直扫

写到最后

请添加图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值