CPU高获取其线程ID然后分析
一、具体步骤
以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。
根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。
通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?
首先显示线程列表:
ps -mp pid -o THREAD,tid,time
找到了耗时最高的线程28802,占用CPU时间快两个小时了!
其次将需要的线程ID转换为16进制格式:
printf "%x\n" tid
最后打印线程的堆栈信息:
jstack pid |grep tid -A 30
找到出现问题的代码了!
现在来分析下具体的代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)
ShortSocketIO是应用封装的一个用短连接Socket通信的工具类。readBytes函数的代码如下:
public byte[] readBytes(int length) throws IOException {
if ((this.socket == null) || (!this.socket.isConnected())) {
throw new IOException("++++ attempting to read from closed socket");
}
byte[] result = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
if (this.recIndex >= length) {
bos.write(this.recBuf, 0, length);
byte[] newBuf = new byte[this.recBufSize];
if (this.recIndex > length) {
System.arraycopy(this.recBuf, length, newBuf, 0, this.recIndex - length);
}
this.recBuf = newBuf;
this.recIndex -= length;
} else {
int totalread = length;
if (this.recIndex > 0) {
totalread -= this.recIndex;
bos.write(this.recBuf, 0, this.recIndex);
this.recBuf = new byte[this.recBufSize];
this.recIndex = 0;
}
int readCount = 0;
while (totalread > 0) {
if ((readCount = this.in.read(this.recBuf)) > 0) {
if (totalread > readCount) {
bos.write(this.recBuf, 0, readCount);
this.recBuf = new byte[this.recBufSize];
this.recIndex = 0;
} else {
bos.write(this.recBuf, 0, totalread);
byte[] newBuf = new byte[this.recBufSize];
System.arraycopy(this.recBuf, totalread, newBuf, 0, readCount - totalread);
this.recBuf = newBuf;
this.recIndex = (readCount - totalread);
}
totalread -= readCount;
}
}
}
问题就出在标红的代码部分。如果this.in.read()返回的数据小于等于0时,循环就一直进行下去了。而这种情况在网络拥塞的时候是可能发生的。
至于具体怎么修改就看业务逻辑应该怎么对待这种特殊情况了。
最后,总结下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
Java 系统性能分析 命令
1. cpu分析
top , pidstat(sysstat)
pid -p PID -t 1 10
vmstat 1 CPU上下文切换、运行队列、利用率
ps Hh -eo tid
pcpu 查看具体线程的CPU消耗
sar 来查看一定世界范围内以及历史的cpu消耗情况信息
查看java线程信息
jstack pid | grep 'nid=0x9999'
2. cs sy消耗比较高
上下文切换性能偏高, jstack -l pid, 查看on object monitor
3. io消耗
pidstat -d -t -p pid 1 100
iostat
4. 网络io消耗
cat /proc/interruptes
sar -n FULL 1 2
转载于:https://www.cnblogs.com/hhandbibi/p/6703070.html
CPU高获取其线程ID然后分析相关推荐
- linux c 获取 进程 线程 id
有些时候,需要在Log中打出进程或线程的ID,以便调试.查找问题. 获取进程ID #include <unistd.h> pid_t getpid(void); 获取线程ID // 方法1 ...
- android获取子线程id,Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
/*** Returns the identifier of this process's user. * 返回此进程的用户的标识符.*/Log.e(TAG,"Process.myUid() ...
- java获取本机IP,系统随机分配端口号,获取当前线程ID
ServerSocket serverSocket = null; //读取空闲的可用端口 String localIp = null; try {serverSocket = new ServerS ...
- android获取子线程id,从onReceive android获取消息线程id或_id
Ashekur Rahman Molla Asik 7 sms android 我试图获取一个保存在手机中的消息ID.但我没能得到它.我现有的代码在这里 @Override public void o ...
- python 中获取线程id
该问题的解决主要参考了网上的几篇文章,在此一并谢过. 1.python下使用ctypes获取threading线程id python的多线程坑坑不断- - python的threading因为封装的太 ...
- linux 线程创建 pthread_create函数 获取线程id
函数原型: #include<pthread.h> int pthread_create(pthread_t*thread,pthread_attr_t *attr, void * ...
- boost::thread编程实战(2)——获取线程id并转化为DWORD类型
1. boost::thread::id 的基础知识 ① boost::thread::id 的对象能够用来标识线程,每个正在运行的线程都可以获取一个唯一可用的线程id,可以通过调用 boost::t ...
- c++ 获取线程id_高效获取当前线程的 id
不同平台获取当前线程 id 的方法 Windows 可以利用微软提供的 api,轻松获取当前线程的 id: int id = GetCurrentThreadId(); Linux Linux 平台一 ...
- docker容器cpu高问题排查_干货详解:一文教你如何利用阿里开源工具,排查线上CPU居高问题...
前言 在我们开发过程中,无法避免的会出现所谓的垃圾代码,导致服务器的CPU一直处于100%.但我们应用已经上线,导致服务器CPU居高,但又不知道哪边出现的问题,我们应该怎么去找出哪边的代码出现问题呢? ...
最新文章
- 可以查python题的_python练习题 -股票查询
- 根据时间比较选择数据
- MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
- ext3grep practice record
- 利用freopen()函数和fc命令简化程序调试
- 【maven插件】maven-resources-plugin
- python中使用kazoo连接zookeeper(一)
- Tomcat相关目录及配置文件总结
- 前端学习(1338):mongoDB删除文档
- css中设置图片旋转45度,css 实现缓和变量,鼠标悬停时元素旋转45度动画
- beta版本项目冲刺
- 《CSS基础教程》 读书笔记三
- Qt QJson遍历
- TURN协议简要介绍
- dwr例外被抛出且未被接住
- echarts常见图形-时间轴(五)
- mysql 提高查询速度_6条策略提高mysql查询速度
- 高斯消元法原理与Matlab实现
- JetBrains DataGrip安装和使用的详细教程
- 怎么处理H5棋牌游戏app下载链接在微信中打不开或者显示已停止访问该网页
热门文章
- 深入研究微服务架构——第一部分
- 直方图 帕累托图_工具讲解 | 用Excel绘制帕累托图
- Java写js的Ajax代码_用JS写的一个Ajax库(实例代码)
- parquet格式_【存储】基于列存之Parquet格式
- java mina文件传输_如何将Apache MINA FTP服务器中上传的文件重定向到数据库?
- predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线
- oracle取第一位,Oracle中的substr()函数和INSTR()函数
- 微信小程序插件---表单验证篇
- csv处理数据后存入数据库
- java org.jsoup does not exist_java使用Jsoup连接网站超时的解决方法