Java进程将CPU或负载拉高及快速定位脚本
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,可能同学经常会遇到生产环境下的某台跑Java的服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高或负载飙高等现象,好一点的负载或CPU一天比一天高,差的情况,就是随机进行抖动,
千家信息网最后更新 2025年12月02日Java进程将CPU或负载拉高及快速定位脚本
可能同学经常会遇到生产环境下的某台跑Java的服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高或负载飙高等现象,好一点的负载或CPU一天比一天高,差的情况,就是随机进行抖动,后又恢复正常,给运维及开发同学带来了不少困扰。当然,出现此问题时,后续要如何改进,诸如:代码上线前要进行review、相关强弱依赖服务隔离/降级等、单元测试、回归测试、SQL上线审核、基础及业务监控、相关流程制度等。
若CPU使用率或负载飙高,且持续时间较长,网上也有大量的排查步骤
方法一
1.使用top定位占用CPU高的进程PID
top
2.获取线程信息
ps -mp PID -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf "%x\n" tid
4.打印线程的堆栈信息
jstack pid |grep tid #这里的tid就是步骤3生成的 十六进制格式的tid
方法二(推荐)
可快速定位thread及thread的cpu使用率
#!/bin/bash# @Function# Find out the most cpu consumed threads of java,and print the stack trace of these threads.## @Usage# $./javacpu -h#PROG=`basename $0`usage(){cat < /dev/null; then [ -n "$JAVA_HOME" ] && [ -f "$JAVA_HOME/bin/jstack" ] && [ -x "$JAVA_HOME/bin/jstack" ] &&{ export PATH="$JAVA_HOME/bin:$PATH" } || { redEcho "Error:jstack nof found on PATH and JAVA_HOME!" exit 1 } fi uuid=`date +%s`_${RANDOM}_$$ cleanupWhenExit(){ rm /tmp/${uuid}_* &> /dev/null } trap "cleanupWhenExit" EXIT printStackOfThread(){ while read threadLine ; do pid=`echo ${threadLine} | awk '{print $1}'` threadId=`echo ${threadLine} | awk '{print $2}'` threadId0x=`printf %x ${threadId}` user=`echo ${threadLine} | awk '{print $3}'` pcpu=`echo ${threadLine} | awk '{print $5}'` jstackFile=/tmp/${uuid}_${pid} [ ! -f "${jstackFile}" ] && { jstack ${pid} > ${jstackFile} ||{ redEcho "Fail to jstack java process ${pid}!" rm ${jstackFile} continue } } redEcho "The stack of busy(${pcpu}%) thread(${threadId}/0x${htreadId0x}) of java process(${pid}) of user(${user}):" sed "/nid=0x${threadId0x}/,/^$/p" -n ${jstackFile} done } [ -z "${pid}" ] && { ps -Leo pid,lwp,user,comm,pcpu --no-headers|awk '$4=="java"{print $0}' |sort -k5 -r -n |head --lines "${count}" | printStackOfThread } || { ps -Leo pid,lwp,user,comm,pcpu --no-headers |awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}' | sort -k5 -r -n |head --lines "${count}" | printStackOfThread } 方法三(针对Java服务器的load负载随机抖动情况)
#!/usr/bin/env pythonimport osimport time, datetimeimport threading# desc: when system loadavg 1 min load lt 10,then dump java jstackdef load_stat():loadavg = {}f = open("/proc/loadavg")info = f.read().split()f.close()loadavg['lavg_1'] = info[0]loadavg['lavg_5']= info[1]loadavg['lavg_15']= info[2]start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + '00:00', '%Y-%m-%d%H:%M')curr_time = datetime.datetime.now()end_time = datetime.datetime.strptime(str(datetime.datetime.now().date() + datetime.timedelta(days=2)) + '23:59', '%Y-%m-%d%H:%M')if (start_time <= curr_time <= end_time ) :if float(loadavg['lavg_1']) >= 11:pid = os.popen("jps |grep -v Jps|awk '{print $1}'").read()cmd = "jstack" + " " + pidstack = os.popen(cmd).read()tm = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())timeslog = 'java_stack_' + tm + r'.txt'log_f = open(timeslog, 'w')log_f.write(stack)log_f.close()cmd_2="ps -mp " + pid.strip('\n') + " -o THREAD,tid,time | sort -rn"top_tid_info=os.popen(cmd_2).read()cpu_tid_logs='tid_cpu_' + tm + r'.txt'log_f2 = open(cpu_tid_logs,'w')log_f2.write(top_tid_info)log_f2.close()threading.Timer(5, load_stat).start()else:threading.Timer(5, load_stat).start()else:exit#return loadavgload_stat()
方法
线程
服务
定位
使用率
信息
同学
就是
情况
时间
服务器
格式
步骤
测试
进程
业务
代码
制度
十六进制
单元
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全奥利匹克杯
碰撞安全性能数据库
智能掌上办公请配置服务器地址
自考软件开发就业率
常德串口服务器价格
伤害世界服务器架设视频
数据库系统自动更新
web登录页面链接数据库
百度网络安全行家
虚拟服务器作用
高速服务器有补胎的地方吗
网络安全手抄报没名字
提升网络安全技术更新快
浙江搜道网络技术有限公司主播
用本地服务器组建局域网
网络安全靠人民的主题手抄报
密云区信息化网络技术服务好处
贵阳澄清软件开发有限公司
网络攻防和网络安全渗透
方舟生存进化这么弄服务器
班玛网络技术有限公司
从哪看电脑服务器端口
数据库原理公式
房地产数据库分为几类
北京恒山系列鲲鹏服务器
sql数据库如何附加
部署网络安全工作已经
街道智慧社区 数据库完善
软件开发主要业绩怎么写
网络安全4所高新受表彰
- 上一篇
无法定位程序输入点_Core_TestDevTransportAbility@4于动态链接库HCCore.dll上
场景添加第三方库之后,正常编译运行一段时间,然后再进行函数调用的时候,出现上面的问题,单独替换HCCore.dll文件,无法解决该问题,通过版本的回溯,将程序依赖的第三方的所有动态库更新一遍,解决了该
- 下一篇
Linux VPS CentOS安装FreeNX桌面环境步骤是怎样的
本篇文章给大家分享的是有关Linux VPS CentOS安装FreeNX桌面环境步骤是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看