一、具体步骤

shift+p 按照cpu排序
shift+m按照内存排序
1、查看进程下所有线程 top -H -p  pid 
2、将十进制数换成16进制:print "%x/n" 线程id
3、查看进程下的线程正在执行的方法:  jstack  pid|grep  0X70d4

以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。

clip_image002

根据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

2

最后打印线程的堆栈信息:

jstack pid |grep tid -A 30

3

找到出现问题的代码了!

现在来分析下具体的代码: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然后分析相关推荐

  1. linux c 获取 进程 线程 id

    有些时候,需要在Log中打出进程或线程的ID,以便调试.查找问题. 获取进程ID #include <unistd.h> pid_t getpid(void); 获取线程ID // 方法1 ...

  2. android获取子线程id,Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID

    /*** Returns the identifier of this process's user. * 返回此进程的用户的标识符.*/Log.e(TAG,"Process.myUid() ...

  3. java获取本机IP,系统随机分配端口号,获取当前线程ID

    ServerSocket serverSocket = null; //读取空闲的可用端口 String localIp = null; try {serverSocket = new ServerS ...

  4. android获取子线程id,从onReceive android获取消息线程id或_id

    Ashekur Rahman Molla Asik 7 sms android 我试图获取一个保存在手机中的消息ID.但我没能得到它.我现有的代码在这里 @Override public void o ...

  5. python 中获取线程id

    该问题的解决主要参考了网上的几篇文章,在此一并谢过. 1.python下使用ctypes获取threading线程id python的多线程坑坑不断- - python的threading因为封装的太 ...

  6. linux 线程创建 pthread_create函数 获取线程id

    函数原型: #include<pthread.h> int  pthread_create(pthread_t*thread,pthread_attr_t   *attr, void * ...

  7. boost::thread编程实战(2)——获取线程id并转化为DWORD类型

    1. boost::thread::id 的基础知识 ① boost::thread::id 的对象能够用来标识线程,每个正在运行的线程都可以获取一个唯一可用的线程id,可以通过调用 boost::t ...

  8. c++ 获取线程id_高效获取当前线程的 id

    不同平台获取当前线程 id 的方法 Windows 可以利用微软提供的 api,轻松获取当前线程的 id: int id = GetCurrentThreadId(); Linux Linux 平台一 ...

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

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

最新文章

  1. 可以查python题的_python练习题 -股票查询
  2. 根据时间比较选择数据
  3. MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
  4. ext3grep practice record
  5. 利用freopen()函数和fc命令简化程序调试
  6. 【maven插件】maven-resources-plugin
  7. python中使用kazoo连接zookeeper(一)
  8. Tomcat相关目录及配置文件总结
  9. 前端学习(1338):mongoDB删除文档
  10. css中设置图片旋转45度,css 实现缓和变量,鼠标悬停时元素旋转45度动画
  11. beta版本项目冲刺
  12. 《CSS基础教程》 读书笔记三
  13. Qt QJson遍历
  14. TURN协议简要介绍
  15. dwr例外被抛出且未被接住
  16. echarts常见图形-时间轴(五)
  17. mysql 提高查询速度_6条策略提高mysql查询速度
  18. 高斯消元法原理与Matlab实现
  19. JetBrains DataGrip安装和使用的详细教程
  20. 怎么处理H5棋牌游戏app下载链接在微信中打不开或者显示已停止访问该网页

热门文章

  1. 深入研究微服务架构——第一部分
  2. 直方图 帕累托图_工具讲解 | 用Excel绘制帕累托图
  3. Java写js的Ajax代码_用JS写的一个Ajax库(实例代码)
  4. parquet格式_【存储】基于列存之Parquet格式
  5. java mina文件传输_如何将Apache MINA FTP服务器中上传的文件重定向到数据库?
  6. predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线
  7. oracle取第一位,Oracle中的substr()函数和INSTR()函数
  8. 微信小程序插件---表单验证篇
  9. csv处理数据后存入数据库
  10. java org.jsoup does not exist_java使用Jsoup连接网站超时的解决方法