本文来自工作实战,xx地方线上系统今年jvm cpu100%好几次,给了运维同学一个bat脚本需要在cpu100%的时候,手动执行去
dump
thread提取线索,每次cpu100%的时候影响范围很大,运维同学很紧张赶快重启服务,导致提取不到线索。这种方式很原始与倡导自动化运维的今天格格不入。
方法总是有的,并且很简单,动动脑筋点子就有了:程序自动检测当cpu超过90%自动dump thread
该解决方案采用的核心技术
生命苦短我用python
- python
- psutil
- subprocess
- 设置windows计划任务来执行python脚本,执行频率设置几分钟一次。
实现思路
核心代码
包含空格才27行
# psutil 模块 用于监控: # 安装 pip install psutil # 打包 pyinstaller -F threaddumptool.py import psutil import time import subprocess # 监控cpu信息: def cpu(): cpu = psutil.cpu_count(False) # cpu核数 默认逻辑cpu核数,False查看真实cpu核数; cpu_per = int(psutil.cpu_percent(2)) # 每秒cpu使用率,(1,True) 每一核cpu的每秒使用率; # print(cpu_per) return cpu_per def dump(count): for proc in psutil.process_iter(['pid', 'name']): if 'java' in proc.info['name']: print(proc.info) psexecPath = 'D:\PSTools\psexec' jdkPath = 'D:/work/software/Java/jdk1.8.0_25/bin/jstack.exe' print(psexecPath+' -s '+jdkPath+' -l %s > d:/threaddump%s_%d.txt'% (proc.info['pid'], proc.info['pid'],count)) subprocess.Popen(psexecPath+' -s '+jdkPath+' -l %s > d:/threaddump%s_%d.txt' % (proc.info['pid'], proc.info['pid'],count), shell=True) # subprocess.Popen('jstack %s > d:/threaddump%s_%d.txt' % (proc.info['pid'], proc.info['pid'],count), shell=True) # subprocess.Popen('jrcmd %s print_threads > d:/threaddump%s.txt' % (proc.info['pid'], proc.info['pid']), shell=True) # psexec -s D:\work\software\Java\jdk1.8.0_25\bin\jstack.exe -l %s > d:/threaddump%s.txt def main(): timer(1) def timer(n): fileCount = 0 while True: cpu_info = cpu() print("cpu占用%s"% (cpu_info)) if cpu_info > 60: fileCount = fileCount + 1 dump(fileCount) time.sleep(60) if fileCount > 10: break time.sleep(n) main()
效果图
运行脚本
dump的线程部分截图
打包EXE
在项目根目录输入 pyinstaller -F threaddumptool.py