`
manzhizhen
  • 浏览: 294271 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

老司机在定位和解决问题时都有着自己的一套方法论,总不能老踩一些重复的坑是吧。老司机一般多少都遇到过服务器cpu高的问题,定位问题的方法网上文章多如牛毛,现这里再总结一下,对于混部多个Java应用的服务器,我们一般会通过如下步骤来定位该问题:

  1. 找到cpu占比高的Java进程ID,通过这一步就知道是哪个Java应用出了问题
  2. 然后再找到该Java进程中哪些线程占用cpu时间比较高,有时候步骤2和步骤1可以合为一个步骤
  3. jstack -l 该Java进程到某个文件(比如/tmp/jstack.dump)
  4. 再将步骤2得到的线程ID由10进制转换成16进制,去jstack.dump文件中看这些线程到底是执行了哪些Java代码,从而可以找出问题。

 

先来看看步骤1,定位cpu占比高的Java进程比较简单,可以直接通过top命令或ps命令,但由于top命令比较简单,不像ps命令有过多的参数,所以大多数会优先使用top命令。

找到出问题的Java进程后,就知道是哪个应用出问题了,这时候该应用的Owner就应该通知到位了。

 

步骤2是进一步定位到出问题的线程,常用的有如下几个方法:

  1. top命令 + shift+H)实时显示线程用肉眼看!
  2. top -Hp $pid 实时用肉眼来看
  3. ps -mp $pid -o THREAD,tid,time 直接看线程快照结果
  4. ps H -eo user,pid,tid,%cpu --sort=-%cpu | grep $pid 直接看线程快照结果。

有时候为了简单,可以直接定位到出问题的线程,这是习惯问题,这里不做过多讨论。

 

不管怎样,都逃不过步骤3,即jstack进程到一个临时文件。

 

步骤4主要是分析问题了,有个稍微“恶心”的是jstack文件中的线程ID用的是16进制,所以我们得把步骤2得来的线程ID转一下

 

由于上面4个步骤说长不长,说短也不短,特别是在定位线上问题时心里难免紧张,命令用的不熟的话,容易造成定位问题时间过长。

 

于是网上老司机就将如上4个步骤合成在一个脚本中,希望通过一个脚本就搞定,作者在网上也找了一些,有的写的很简单,但就是执行起来报错;有的写的很专业,功能齐全,文档也写的比较好,但过于复杂,修改起来难度高,不太敢在线上环境使用。

 

于是作者又花了点时间重复造了一个轮子,写了一个只有35行的Shell脚本,并"厚颜无耻"的写成了本篇博文,作者的思路其实很简单,将前3个步骤的结果直接写入jstack后的文件中,一个jstack后的文件即可完成问题定位!

 

<!--StartFragment--> <!--EndFragment-->

先来看看使用该脚本生成dump文件内容:


 

有了上图的文件,就可以直接在文件中找cpu占比为94.3的0x65c6等线程的对于代码了!是不是很方便?为了方便多次采样,该脚本生成的文件名为pid-$pid-时间.jstack,默认放在/tmp目录下,比如如果是ID为12345的Java进程的cpu占比最高,那么通过该脚本生成的文件有可能是/tmp/pid-12345-20180217T22:51:03.jstack。

 

因为脚本做的事情不多,也很简单,只有35行,你看到哪里不爽,可以直接修改,下面直接附上该shell脚本代码:

 

#!/bin/bash
 
# 入参只有一个,即目标java的pid,如果没有,则默认找cpu最高的java进程
if [ -z "$1" ]; then
        ### 1.先找到消耗cpu最高的Java进程 ###
        pid=`ps -eo pid,%cpu,cmd --sort=-%cpu | grep java | grep -v grep | head -1 | awk 'END{print $1}' `
        if [ "$pid" =  ""  ]; then
                echo "无Java进程,退出。"
                exit
        fi
else
        pid=$1
fi
 
### 2.生成dump后的文件名 ###
curTime=$(date +%Y%m%dT%H:%M:%S)
# jstack后的文件会加上时间,便于对一个进程dump多次
dumpFilePath="/tmp/pid-$pid-$curTime.jstack"
echo -e "cpu最高的java进程: "`jps | grep $pid`"\n" > $dumpFilePath
 
### 3.取到该进程的所有线程及其cpu(只显示cpu大于0.0的线程) ###
echo -e "进程内线程cpu占比如下(不显示cpu占比为0的线程):\n" >> $dumpFilePath
ps H -eo pid,tid,%cpu --sort=-%cpu | grep $pid | awk '$3 > 0.0 {totalCpu+=$3; printf("nid=0x%x, cpu=%s\n", $2, $3) >> "'$dumpFilePath'"}
END{printf("cpu总占比:%s\n\n", totalCpu) >> "'$dumpFilePath'"}'
 
### 4.dump该进程 ###
echo -e "如下是原生jstack后的结果:\n" >> $dumpFilePath
jstack -l $pid >> $dumpFilePath
 
echo "dump成功,请前往查看(文件名包含时间,为了采集更准确,可以多执行几次该命令):" $dumpFilePath
 
exit

 

记住,执行该脚本你得拥有使用jps、jstack等命令的权限。

 

使用方法(假设将上述脚本保存为javacpu.sh文件

方法1直接让脚本来查找cpu占比最高Java进程并在/tmp目录下生成dump文件,直接sh ./javacpu.sh即可

方法2:直接使用该脚本在/tmp目录下形成某个Java进程(比如ID为123456)的dump文件,可以sh ./javacpu.sh 123456

 

先解决问题再去定位问题,这是线上事故处理的第一原则,如果遇到线上cpu高问题,先多次执行该脚本以便留下“犯罪”现场,然后再重启或回滚服务,后面再去分析该脚本生成的文件来定位问题。

 

本文很短,也没有阐述高深的技术知识,但想和各位分享一句从老大那听来的一句话:将小事做到极致,就是创新。工作如此,人生也如此。

<!--StartFragment--> <!--EndFragment--> 

  • 大小: 448.4 KB
0
0
分享到:
评论
4 楼 manzhizhen 2018-03-02  
pan19849529 写道
'/javacpu.sh: line 10: syntax error near unexpected token `
'/javacpu.sh: line 10: `        fi 


这个只能在你电脑具体调试了,我试了几个我同事的电脑,没问题了,你找你同事帮你调试下吧。
3 楼 pan19849529 2018-02-28  
'/javacpu.sh: line 10: syntax error near unexpected token `
'/javacpu.sh: line 10: `        fi 
2 楼 manzhizhen 2018-02-28  
pan19849529 写道
shell 脚本10行报语法错误


能发出来吗?我这边试了是没问题的。。。
1 楼 pan19849529 2018-02-27  
shell 脚本10行报语法错误

相关推荐

    提高cpu利用率的shell脚本

    需要提高cpu利用率的shell脚本

    linux-让多核CPU达到指定的CPU使用率脚本

    "linux-让多核CPU达到指定的CPU使用率脚本"是一个旨在提升机器CPU使用率的实用工具,它能帮助系统管理员更好地控制和利用计算资源。下面我们将详细探讨相关知识点。 1. **CPU使用率**: - CPU使用率是指CPU在单位...

    消耗linux服务器cpu脚本

    cpu.sh是消耗cpu的脚本,执行方式为 bash cpu.sh 4,最后的数字是cpu核数,执行后需要将打印出来的pid手动录入pid.txt,以便后续kill掉。该代码简单实用,可以迅速占用cpu以达到消耗cpu的目的,可以应付各种服务器...

    测试消耗CPU和内存资源的工具脚本

    测试消耗CPU和内存资源的工具脚本 第一个版本: 支持固定CPU占用 支持固定内存占用 暂不支持动态 1. 上传 到 linux 2. 赋 可行性权限 chmod +x eat-cpu-memory.sh 3. 运行命令:./eat-cpu-memory.sh 第一个参数...

    CPU温度zabbix自动发现脚本-Windows

    在Windows环境中,CPU温度是衡量系统健康状况的重要指标之一,过高可能会导致硬件故障或性能下降。本文将详细讲解如何使用Zabbix的自动发现功能来监控Windows系统的CPU温度。 首先,"CPU温度zabbix自动发现脚本-...

    windows server进程内存占用及CPU使用率自动监控并记录脚本

    总结来说,"windows server进程内存占用及CPU使用率自动监控并记录脚本"是一种实用的运维工具,它通过集成`Tasklist`和`WMIC`命令,定期收集并记录服务器上特定进程的资源使用情况,有助于快速定位和解决性能问题。...

    CPU和内存监测分析脚本

    在IT领域,对系统资源的监控是至关重要的,特别是对于CPU和内存的使用情况,它们直接影响着系统的性能和稳定性。...通过学习和掌握这类脚本的编写,可以增强在实际工作中的问题排查和性能优化能力。

    linux 运维自动监测脚本(CPU,内存,磁盘,负载),自测成功

    本文将详细介绍如何使用Linux脚本来实现自动监测服务器的CPU、内存、磁盘使用情况以及系统负载,并在超过预设阈值时发送告警邮件。这一方法可以帮助运维人员及时发现并预防服务器资源紧张的问题。 首先,我们要编写...

    关于 UWB 定位的五种定位算法 的Matlab脚本_多点定位 超宽带定位

    关于 UWB 定位的五种定位算法的 Matlab 脚本。这五种算法是扩展卡尔曼滤波器 (EKF)、无迹卡尔曼滤波器 (UKF)、基于泰勒级数的位置估计、三边测量和多边测量方法。 提供了有关 UWB 定位系统的五种定位算法的 Matlab ...

    Windows刷CPU使用率工具

    在Windows操作系统中,有时我们需要测试或模拟高CPU使用率的情况,例如检查系统在压力下的表现或者测试特定软件的性能。"Windows刷CPU使用率工具"就是为此目的设计的一款实用工具。这款工具允许用户通过浏览器来设定...

    mysql 批量杀cpu 高耗进程脚本

    mysql 批量杀cpu 高耗进程脚本 ,注意里面注释

    proxmox 6 显示CPU温度脚本

    标题中的“proxmox 6 显示CPU温度脚本”是指在Proxmox VE 6这个虚拟化平台中,通过自定义脚本来实现监控并显示服务器的CPU温度。Proxmox VE是一个基于Debian Linux的开源虚拟化管理平台,它支持KVM虚拟机和LXC容器,...

    BAT批处理脚本-文件相关操作-使用WMI别名获取CPU信息.bat.zip

    本文将深入探讨标题为"BAT批处理脚本-文件相关操作-使用WMI别名获取CPU信息.bat.zip"的资源,该资源包含了一个批处理脚本,用于通过WMI(Windows Management Instrumentation)来获取计算机的CPU信息。 首先,让...

    找出占用CPU 内存过高的进程脚本

    找出占用CPU 内存过高的进程脚本

    性能测试工具CPU2006测试脚本run.sh

    博友说cpu2006缺少脚本,现在上传脚本,不同PC机不一样,各自更换参数

    shell脚本自动监测系统cpu资源,异常彪高时,自动打印应用线程日志文件

    总的来说,这个shell脚本解决方案提供了一种自动化的方法来监控CPU资源,并在必要时进行问题排查,对于保障服务稳定性和优化系统性能具有重要意义。通过熟练掌握shell脚本,IT从业者可以构建更多实用的自动化工具,...

    shell脚本,通过snmp方式获取远程服务器的CPU内存和硬盘的使用率

    本教程将详细讲解如何使用Shell脚本结合SNMP(简单网络管理协议)来实现这一目标。 首先,SNMP是一种广泛应用于网络设备管理的标准协议,它允许管理员收集和配置网络设备的信息。在Linux系统中,我们通常使用`...

    消耗CPU资源的shell脚本

    在某些情况下,例如测试、调试或性能分析,我们可能需要编写一个脚本来模拟高CPU负载,以检查系统在极限条件下的表现。标题提到的“消耗CPU资源的shell脚本”就是这样一个例子,它通过创建一个死循环来占用CPU资源。...

    CPU负载监控脚本代码.docx

    CPU负载监控脚本代码 基于给定的文件信息,我们可以总结出以下知识点: 1. Shell脚本编程:该脚本代码使用bash shell脚本语言编写,用于监控服务器的CPU负载。 Shell脚本是一种特殊的编程语言,用于在Unix/Linux...

    游戏脚本高级编程光盘文件3

    - **错误处理与调试**:学习编写健壮的脚本,包括异常处理、日志记录,以及使用调试工具进行问题定位。 - **UI系统**:了解如何使用脚本创建和控制游戏界面元素,实现菜单、提示、选项等。 - **物理模拟**:如果...

Global site tag (gtag.js) - Google Analytics