背景

一大早收到运维同学反馈、线上某台机器cpu的负载达到了97%以上,为了不影响机器上服务的正常运行,急需找到导致负载过高的原因并将负载降到合理的区间。

用到命令

top/uptime:查看负载情况

语法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

参数说明

  • d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
  • q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
  • c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
  • S : 累积模式,会将己完成或消失的子进程 ( dead child process ) 的 CPU time 累积起来
  • s : 安全模式,将交谈式指令取消, 避免潜在的危机
  • i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
  • n : 更新的次数,完成后将会退出 top
  • b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

jps:查看java进程

jstack:Java进程中线程的堆栈信息跟踪工具

通过男人手册man查看jstack命令介绍

$jstack [ option ] pid

参数说明:

pid: java应用程序的进程号,一般可以通过jps来获得;

-F:Force a stack dump when jstack [-l] pid does not respond.

-l:Long listing. Prints additional information about locks such as a list of owned java.util.concurrent ownable synchronizers.

jstat:堆内存各部分的使用量,以及加载类的数量

Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控

语法:jstat [ generalOption, outputOptions vmid, [ interva,count ]

参数:

  1. generalOption: 一般使用-gcutil查看GC情况
  1. vmid: 虚拟机进程号,即当前运行的java进程号
  1. interval: 间隔时间,单位为秒或毫秒
  1. count: 打印次数,如果缺省则打印无数次

查询GC总体使用情况:jstat -gcutil 23484 1000 5

垃圾总体回收统计:jstat -gc 18528 1000 5

新生代垃圾回收统计:jstat -gcnew 18528 1000 5

堆内存统计
jstat -gccapacity 18528 1000 5 //整体统计

jstat -gcnewcapacity 18528 1000 5 //新生代统计

jstat -gcoldcapacity 18528 1000 5 //老年代统计

ps:查看进程信息

排查思路

第一步:使用top命令查看负载的情况,查到负载过高的进程号

  • 执行top -c ,显示进程运行信息列表

  • 键入P (大写p),进程按照CPU使用率排序

根据top命令查看负载情况、cpu占用情况、确定进程号pid

  1. load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。(我的机器4核16g修复前都超过了10)

  2. load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了

提示:也可以使用uptime命令查看当前负载情况、链接用户数等信息

 13:29:09 up 2 days,  7:13,  4 users,  load average: 0.07, 0.02, 0.00

In this line:

  • 13:29:09 is the current time
  • 2 days, 7:13 is the uptime
  • 4 users shows how many users currently use your system
  • 0.07 – average load for the last minute
  • 0.02 – average load for the last 5 minutes
  • 0.00 – average load for the last 15 minutes

第二步:根据pid,通过ps命令确定是哪个服务出现了异常

ps -ef|grep pid

确定了服务之后、可以找下服务对应负责人,看看服务是不是有什么异常

第三步:top输出中打开线程查看,使用命令 top -H

  • top -Hp pid ,显示一个进程的线程运行信息列表

  • 键入P (大写p),线程按照CPU使用率排序

 提示:可以通过键盘上的c键,切换输出模式,方便查看更详细的信息

第四步:查看堆栈信息

找到对应的线程号之后,使用jstack pid > jstack.txt 命令,将进程的堆栈存入txt文档内,将通过top -H查到的线程pid转换成16进制(可以借助在线转换工具,之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。)或者 使用 printf "%x\n" pid,然后在jstack.txt文档内查到对应的数据,这样就可以看到对应的信息堆栈信息了

看的出来:"VM Thread"就是该cpu消耗较高的线程,查看相关文档我们得知,VM Thread是JVM层面的一个线程,主要工作是对其他线程的创建,分配和对象的清理等工作的。从后面几个线程也可以看出,JVM正在进行大量的GC工作。这里的原因已经比较明显了,即大量的GC工作导致项目运行缓慢

第五步:那么具体是什么原因导致这么多的GC工作呢?进一步查看gc情况

jstat -gcutil 64015 1000 5

第六步:定位原因的现有jvm的参数无法满足gc的正常使用,最终调高jvm的xmx/xms/xmn的启动参数,问题得以解决

记录一次线上CPU负载过高的排查过程相关推荐

  1. 线上CPU负载过高处理

    一.背景 线上CPU报警 占用率过 90% 告警了一晚上 第二天才处理的. 二.处理 1.top 命令 使用 top 命令查看后,load average 也是超负荷的状态,用户态的CPU占比 确实很 ...

  2. [JVM]线上CPU负载持续飙高的问题解决

    [JVM]线上CPU负载持续飙高的问题解决 参考文章: (1)[JVM]线上CPU负载持续飙高的问题解决 (2)https://www.cnblogs.com/zhengwangzw/p/115465 ...

  3. 线上服务器CPU负载过高的问题解决过程

    线上服务器CPU负载过高的问题解决过程 一.找到CPU占用过高进程 执行top命令,发现PID为12443的Java进程占用CPU高达350%,出现故障. 二.定位具体线程或代码 找到该进程后,接下来 ...

  4. Java 线上cpu占用过高分析

    转载于:https://blog.csdn.net/ch999999999999999999/article/details/113151519 感谢作者:ch999999999999999999 J ...

  5. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  6. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  7. 线上服务器CPU占用率高如何排查定位问题?

    (关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...

  8. docker容器cpu高问题排查_干货详解:一文教你如何利用阿里开源工具,排查线上CPU居高问题...

    前言 在我们开发过程中,无法避免的会出现所谓的垃圾代码,导致服务器的CPU一直处于100%.但我们应用已经上线,导致服务器CPU居高,但又不知道哪边出现的问题,我们应该怎么去找出哪边的代码出现问题呢? ...

  9. 你要偷偷学会排查线上 CPU 飙高的问题,然后惊艳所有人!

    作者 l Hollis 来源 l Hollis(ID:hollischuang) 前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右. 因为最近接入 ...

最新文章

  1. ZLAN串口转接以太网ZLSN3003S
  2. java基础(七) 深入解析java四种访问权限
  3. vs2013 error MSB8031 MBCSMFC问题的解决
  4. linux nfs时间不对,NFS挂载主机或不稳定的原因与解决方法
  5. C++平衡二叉树(AVL树)
  6. 产品原型制作_早期制作原型如何帮助您设计出色的数字产品
  7. 怎么配置SQLServer2005以允许远程连接
  8. 微软笔试题(看到的写答案啊)
  9. C++_IO类型_文件输入输出流_字符串流
  10. 开始位置 环状图_水星轨道发现千万公里环状结构,或将发现新的行星环
  11. html页面怎么引用通用的头部,html 如何引入一个公共的头部和底部
  12. pip安装requirement.txt
  13. 【译】变分自编码器教程 一、简介
  14. 界面清爽的SNS社交网络系统源码 PHP+MySQL(已整合IM聊天系统)
  15. 线性判别分析(Linear Discriminant Analysis,LDA)
  16. 用友U9 UFSoft.UBF.Business.Session
  17. Error creating bean with name 'sqlSessionFactory' defined in URL
  18. 求解“背包问题”的“粒子群算法”
  19. 交互式分割: Interactive Object Segmentation with Inside-Outside Guidance
  20. 选股服务器列表为空 无法执行选股,东方财富客户端如何设置自动选择服务器 设置有条件选股方法...

热门文章

  1. ant design pro vue左侧菜单自定义图标
  2. 遍历各盘符,搜索是否安装某软件exe(某文件是否存在)
  3. unity应用开发实战案例_Unity3D游戏引擎开发实战从入门到精通
  4. PAT 2019年冬 7-3 Summit AC代码
  5. Winner 赢家 (2A - Winner) map
  6. 深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)
  7. verilog_边学边练习(2)二选一_四选一(组合逻辑电路)
  8. 全国首个元宇宙高校院系都已成立,你还在选择就业方向吗?
  9. linux 下的软件的安装与卸载
  10. 虹科_实现将任何传感器转换成GigE Vision设备