文档章节

cpu负载过高案例,解决方法记录

-悟空-
 -悟空-
发布于 2015/08/20 08:46
字数 870
阅读 2236
收藏 21

先讲下问题来源,前一段时间线上服务器负载高的吓人,作为一台只部署了tomcat的应用服务器,平时load average 也就在零点几的水平,突然达到十几真是让人惊了个呆(⊙ˍ⊙),生怕服务器分分钟宕掉啊。

赶紧找问题发生原因吧,我以前没有遇到过这类问题,没啥经验可谈,首先服务器上top下,发现最耗cpu的就是我们的应用服务器,如图:

负载高

我马上想到的是我们有异步处理的多线程程序,是不是哪个程序死锁了或者一直跑着,不释放。于是查看了最近修改的代码,也没有发现那里可能会发生死循环,那干脆打印下堆栈看看到底都有什么线程在跑着吧。到jdk的bin路径下 用jstack pid >xxx.stack命令打印堆栈内容。

堆栈

快1MB的内容,真的没法去找,都是一些TIMED_WAITINGWAITING这些可以先不用去看,优先级高的应该是那些RUNNABLE的,因为都已经等待了,就消耗不到cpu了啊。看了半天也没看出啥名堂,最后在其他博客上取取经,发现了实用的技巧。

具体思路:

首先要找到哪几个线程在占用cpu,之后再通过线程的id值在堆栈文件中查找具体的线程,看看出来什么问题。

OK,实战开始,第一个命令

ps -mp pid -o THREAD,tid,time

其中pid 换成要查看的进程的id值,这个命令的作用就是打印出进程下有哪几个线程在跑,并且分别占用cpu多长时间。

ps不熟悉话,可以在linux下查看man ps文档,看看具体那几个命令的作用

-p的后面跟着要显示的进程的id号, -m的意思是显示这个进程下的所有线程 -o的意思是格式化要输出的内容

通过上边这个命令,显示出一堆线程,通过筛选之后发现了几个占用cpu很长的线程

%CPUTIDTIME
17.31617212:18:58
79.9162752-08:49:22
19.841812:16:02
32.61307112:17:14

这下可算找到罪魁祸首了,看第二个线程cpu占用的吓人,并且占用时间也是高的离谱,我记住它了( *⊙~⊙)。

第二个命令,将找到的线程id号转成十六进制

printf "%x\n" tid

这个很简单,就不解释了,得到结果是3f93

之后就是在最初打印的堆栈信息中查找这个线程,Bingo!

bug_problem

请原谅,把关键信息注释上了,哈哈。找到这个线程,可以看到具体出问题的代码行了,对就是我注释那几个代码行,之后就在源码中查找下,发现真的有一个死循环在那里(⊙﹏⊙)b,好了既然找到了那就fix掉就可以了。

在一次上线之后服务器的情况:

fix_bug

又健健康康的啦~~~。

结尾再费点唾沫,查找好cpu的线程时一共有四个,其实那三个我也找了,发现是我们自己创建的线程池,所以不是问题啦。

参考文章: 线上应用故障排查之一:高CPU占用

© 著作权归作者所有

共有 人打赏支持
-悟空-

-悟空-

粉丝 143
博文 25
码字总数 35562
作品 0
海淀
高级程序员
私信 提问
无法连接windows实例的问题排查

无论何种原因导致无法远程连接实例,先尝试用阿里云提供的远程连接功能进行连接,然后再按原因分类进行故障排查。 1. 客户端本地网络异常 故障现象:用户无法登录外网。 可能原因:网卡驱动未...

lulullll
2018/11/10
0
0
程序占用cpu过高问题解决

现象:登录机器发现有卡顿现象,于是top发现负载特别高,并且发现一进程占满cpu 定位:记录下该进程号,然后top -Hp <pid>找出占用cpu过高的几个线程,记录线程id,根据这几个线程id到程序线...

Small-Liu
2016/06/16
99
0
hadoop 1.X资源管理机制缺陷分析和解决方案

一、概述 用hadoop1.x版本已经有一年多了,在使用的过程中发现hadoop1.X的资源管理机制存在诸多缺陷,甚至在这种资源管理机制下会造成服务器资源的严重浪费,负载过高或者过低。本文主要介绍...

zengzhaozheng
2018/07/02
0
0
swift部署多proxy并实现负载均衡

5台服务器 A B C D E A为负载均衡 BCDE 既做proxy server 又做storage server 负载均衡工具的选择: nginx:0.6.33版本后不允许POST方法访问静态资源,swift 只有head get方法能用,post pu...

长平狐
2013/11/25
212
0
解决tomcat占用CPU过高

因生产环境tomcat占用CPU持续过高,负载过高,重启tomcat过于缓慢,参与网上资料,解决tomcat占用CPU过高,重启缓慢问题 1、通过top命令找出占用CPU高的PID top - 15:52:18 up 93 days, 2:23...

hbssliulei
2013/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
399
6
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
4
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
13
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部