如何使用JDK及Linux工具查找进程中最忙的线程
2014-11-18 16:19
363 查看
最近一个项目中在测试的时候发现负载总是很多,为了想看看到底是什么线程比较占用CPU
首先先用top查看占用最高的pid,筛选pid的话可以用项目先用账户名(我的是storm)
pid => top -u storm|head -n 1 |awk '{print $1}'
然后再根据这个pid使用top查看进程中最忙的线程,
threadId => top -Hp $pid
好,下面我们需要观察当前JVM中各个线程的执行状态,使用jstack即可
jstack $pid > info
打开info文件,发现类似的
"Thread-31" prio=10 tid=0x000000004de52800 nid=0x2517 runnable [0x0000000046942000]
这样的信息,这里的nid其实就是线程编号,只不过是十六进制格式,
printf '%x\n' $threadId,这样即可!
查到info中对应这个线程正在执行对应程序的HBase batch操作
"Thread-31" prio=10 tid=0x000000004de52800 nid=0x2517 runnable [0x0000000046942000]
java.lang.Thread.State: RUNNABLE
at java.util.concurrent.ConcurrentHashMap$HashEntry.newArray(ConcurrentHashMap.java:205)
at java.util.concurrent.ConcurrentHashMap$Segment.<init>(ConcurrentHashMap.java:291)
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:613)
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:652)
at com.xxx.hbase.HBaseHandler.doCopy(HBaseHandler.java:111)
at com.xx.hbase.HBaseHandler.runBatch(HBaseHandler.java:69)
at com.xx.hbase.HBaseHandler.run(HBaseHandler.java:53)
针对此段代码优化后,
原来代码是一个线程在不停检测数据量做batch操作,后来修改为休眠5ms(之前因为设置过大导致RPC请求时出现OOM)
CPU优化从本来200-300降到20上下
首先先用top查看占用最高的pid,筛选pid的话可以用项目先用账户名(我的是storm)
pid => top -u storm|head -n 1 |awk '{print $1}'
然后再根据这个pid使用top查看进程中最忙的线程,
threadId => top -Hp $pid
好,下面我们需要观察当前JVM中各个线程的执行状态,使用jstack即可
jstack $pid > info
打开info文件,发现类似的
"Thread-31" prio=10 tid=0x000000004de52800 nid=0x2517 runnable [0x0000000046942000]
这样的信息,这里的nid其实就是线程编号,只不过是十六进制格式,
printf '%x\n' $threadId,这样即可!
查到info中对应这个线程正在执行对应程序的HBase batch操作
"Thread-31" prio=10 tid=0x000000004de52800 nid=0x2517 runnable [0x0000000046942000]
java.lang.Thread.State: RUNNABLE
at java.util.concurrent.ConcurrentHashMap$HashEntry.newArray(ConcurrentHashMap.java:205)
at java.util.concurrent.ConcurrentHashMap$Segment.<init>(ConcurrentHashMap.java:291)
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:613)
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:652)
at com.xxx.hbase.HBaseHandler.doCopy(HBaseHandler.java:111)
at com.xx.hbase.HBaseHandler.runBatch(HBaseHandler.java:69)
at com.xx.hbase.HBaseHandler.run(HBaseHandler.java:53)
针对此段代码优化后,
原来代码是一个线程在不停检测数据量做batch操作,后来修改为休眠5ms(之前因为设置过大导致RPC请求时出现OOM)
CPU优化从本来200-300降到20上下
相关文章推荐
- Linux环境下如何查找哪个线程使用CPU最长
- Linux环境下如何查找哪个线程使用CPU最长
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )
- 线程死锁及如何使用JDK自带工具监测是否有死锁现象
- linux高级工具命令(三)使用gprof和oprofile查找性能瓶颈
- 如何在Window或Linux/Unix中查找并干掉占用指定端口的进程
- Linux如何查找杀死僵死进程
- linux如何获取每个进程使用了多少swap
- linux下查找局域网内的ip--nmap工具使用
- KB824209:如何使用 EventcombMT 实用工具搜索事件日志以查找帐户锁定
- 如何使用crash工具分析Linux内核崩溃转储文件
- Linux 下如何查找指定端口被哪个进程占用 lsof
- 如何使用调试诊断工具来解决在 IIS 中没有响应的进程
- linux 如何对待进程和线程。
- linux高级工具命令(三)使用gprof和oprofile查找性能瓶颈
- Linux 如何查看进程的各线程的CPU占用
- 在Linux的Vim编辑器中,如何使用非贪婪匹配模式查找
- Linux下创建进程线程以及通信技术的使用
- 如何使用profile工具来解决程序中的瓶颈 --linux篇
- Linux如何查找杀死僵死进程