CPU高的排查
之前有朋友反馈说发的内容希望有个梯度,逐步加深,前面发了几篇关于jvm源码分析的文章,可能我觉得我已经把内容写得浅显易懂了,但是对于某些没怎么接触的同学来说还是比较难理解,这个我以后慢慢改进吧,今天发篇轻松点的文章,可能大家在工作过程中也会可能碰到类似的问题,或许有经验的同学看到这个题目就知道我要说什么了,也有自己的定位方法。
话不多说了,先来看代码吧
public class Test{
public static void main(String args[]){
for(int i=0;i<10;i++){
new Thread(){
public void run(){
try{
Thread.sleep(100000);
}catch(Exception e){}
}
}.start();
}
Thread t=new Thread(){
public void run(){
int i=0;
while(true){
i=(i++)/100;
}
}
};
t.setName("Busiest Thread");
t.start();
}
}
这个例子里新创建了11个线程,其中10个线程没干什么事,主要是sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗cpu的线程了,那怎么把这个线程给抓出来呢?
首先我们可以通过top -Hp <pid>来看这个进程里所有线程的cpu消耗情况,得到类似下面的数据
$ top -Hp 18207
top - 19:11:43 up 573 days, 2:43, 2 users, load average: 3.03, 3.03, 3.02
Tasks: 44 total, 1 running, 43 sleeping, 0 stopped, 0 zombie
Cpu(s): 18.8%us, 0.0%sy, 0.0%ni, 81.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 99191752k total, 98683576k used, 508176k free, 128248k buffers
Swap: 1999864k total, 191064k used, 1808800k free, 17413760k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18250 admin 20 0 26.1g 28m 10m R 99.9 0.0 0:19.50 java Test
18207 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18208 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.09 java Test
18209 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18210 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18211 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18212 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18213 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18214 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18215 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18216 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18217 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18218 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18219 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18220 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18221 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18222 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18223 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18224 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18225 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18226 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
18227 admin 20 0 26.1g 28m 10m S 0.0 0.0 0:00.00 java Test
拿到这个结果之后,我们可以看到cpu最高的线程是pid为18250的线程,占了99.8%:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18250 admin 20 0 26.1g 28m 10m R 99.9 0.0 0:19.50 java Test
接着我们可以通过jstack <pid>的输出来看各个线程栈:
$ jstack 18207
2016-03-30 19:12:23
Full thread dump OpenJDK 64-Bit Server VM (25.66-b60 mixed mode):
"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007fb90be13000 nid=0x47d7 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"DestroyJavaVM" #29 prio=5 os_prio=0 tid=0x00007fb96245b800 nid=0x4720 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]
java.lang.Thread.State: RUNNABLE
at Test$2.run(Test.java:18)
"Thread-9" #27 prio=5 os_prio=0 tid=0x00007fb91498c800 nid=0x4749 waiting on condition [0x00007fb906bfe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test$1.run(Test.java:9)
"Thread-8" #26 prio=5 os_prio=0 tid=0x00007fb91498b800 nid=0x4748 waiting on condition [0x00007fb906ffe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test$1.run(Test.java:9)
"Thread-7" #25 prio=5 os_prio=0 tid=0x00007fb91498b000 nid=0x4747 waiting on condition [0x00007fb9073fe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test$1.run(Test.java:9)
"Thread-6" #24 prio=5 os_prio=0 tid=0x00007fb91498a000 nid=0x4746 waiting on condition [0x00007fb9077fe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test$1.run(Test.java:9)
...
上面的线程栈我们注意到nid的值其实就是线程ID,它是十六进制的,我们将消耗cpu最高的线程18250,转成十六进制0X47A,然后从上面的线程栈里找到nid=0X47A的线程,其栈为:
"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]
java.lang.Thread.State: RUNNABLE
at Test$2.run(Test.java:18)
即将最耗cpu的线程找出来了,是Businest Thread
CPU高的排查的更多相关文章
- CPU高问题排查
双11大战开始了,这几天公司系统压测,CPU各种报警,于是找了篇关于CPU高问题排查的文章. 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎 ...
- 再一次生产 CPU 高负载排查实践
前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨. 其实早在去年我也处理过类似的问题,并记录下来:<一次生产 CPU 1 ...
- Ubuntu1804下k8s-CoreDNS占CPU高问题排查
1.背景: 最近在ubuntu804上适配k8s的时候,部署到业务pod的时候,出现了服务器卡死,top查看发现负载很高,进行CPU排序发现如下信息,可知是CoreDNS服务导致. 2. 分析排查: ...
- 生产环境下JAVA进程高CPU占用故障排查
问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ...
- STORM在线业务实践-集群空闲CPU飙高问题排查
源:http://daiwa.ninja/index.php/2015/07/18/storm-cpu-overload/ 2015-07-18AUTHORDAIWA STORM在线业务实践-集群空闲 ...
- Java服务器内存过高&CPU过高问题排查
一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释 ...
- linux Java项目CPU内存占用高故障排查
linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对 ...
- cpu load过高问题排查
load average的概念 top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载. 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少 ...
- centos7-java模拟cpu占用高及排查
环境 centos7 1核2GB Java8 模拟cpu占用高 新建一个名为jvm-learn的springboot项目 模拟代码如下 import org.springframework.boot. ...
随机推荐
- ES6新特性-函数的简写(箭头函数)
通常函数的定义方法 var fn = function(...){ ...... } //例如: var add = function(a,b){ return a+b; } //或者: functi ...
- 【LeetCode每天一题】Minimum Path Sum(最短路径和)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 干了这杯Java之集合概览
Java集合框架支持两种类型容器: 一种是为了存储一个元素的合集,为Collection 一种是为了存储键/值对,为Mapping Collection包含 Set存储不重复的元素 List存储一个有 ...
- JS全选反选功能
总选框:<input type="checkbox" class="all" name="all"> 子选框: <inpu ...
- Mysql事务隔离级别学习
这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级 ...
- nuxt 2
原文出处:
- 计算机网络网络层的IP地址划分及子码
现在在网络层,即就是TCP/IP协议里的网际互联层,最流行IP协议的就是IPV4.其中IP地址的格式是由32位二进制数字表示的,通常为了人们阅读习惯,将其转换成点分十进制来表示,如:192.168.1 ...
- ASP.NET MVC案例教程(七)
前言 写这篇文章的目的,是想总结一些东西,以帮助朋友们更好的使用这个框架.但是,我又不像把官方列举的哪些优势.功能翻译过来列举在这里.所以,我想干脆我就纯从个人观点上对这个框架评论一下吧.说的不好 ...
- Tableau 学习资料
官方文档: https://www.tableau.com/zh-cn/support/help 其他教程: tablaue破解版_tableau10 破解_tableau server 破解:htt ...
- zigbee 安全通信加密链接密钥
---恢复内容开始--- #define KEY_TYPE_TC_MASTER 0 // Trust Center Master Key信任中心主密钥#define KEY_TYPE_ ...