您的位置:首页 > 运维架构 > Linux

如何使用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上下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: