oldmanpushcart / greys-anatomy

Java诊断工具
Apache License 2.0
4.02k stars 1.22k forks source link

top 命令没有说明文档而且似乎不怎么好用 #231

Open whitelilis opened 6 years ago

whitelilis commented 6 years ago

top 这个命令的作用我猜是要找到当前最占 cpu 的方法,但是实际打出来的东东很多都是 parking 的线程,实际没有占用 cpu。 这个命令的输出如果是用类似 jvmtop ( https://github.com/patric-r/jvmtop ) 的 --profile 选项生成的结果,就特别棒了。 当然, jvmtop 使用的是采样的方法,对性能有一定的影响,我觉得这个应该还好。

主要的应用场景是:这程序好慢啊, cpu 打满了,它在干什么呢? 这时一般要 jstack 一把,然后看 RUNNING 的,人肉分析哪些是真正有用的, 但是好烦啊。

whitelilis commented 6 years ago

我提了个 PR。呵呵。自己测试还可用。

whitelilis commented 6 years ago

这里面其实还有几个问题: 1, IN_NATIVE 和 IN_VM 的状态是不是应该考虑 2,epoll 也有很多 sun.nio.ch.EPollArrayWrapper.epollWait 的状态,也是 RUNNABLE 的,我觉得应该不考虑。

oldmanpushcart commented 6 years ago

top命令是G友 @rodbate 贡献的哦,我抄送他一起讨论。 在这个PR中我提出了我的疑问~

没有在帮助文档中提及,这是我的锅,我在下一个版本发布的时候捎带上

rodbate commented 6 years ago

好久以前的, [都快忘了,以前写这个命令是有业务的需求,现在看来是有点粗糙,可以优化的。另外谢谢 @oldmanpushcart merge and update

whitelilis commented 6 years ago

或者逻辑可以改一下: 默认只统计 RUNNABLE 的(当前是所有的), -r 参数, 当需要 NATIVE 时,用 -n 参数, 当需要 Parking 时,用 -p 参数; 当需要epoll 时, 用 -e 参数; 当需要 jvm 时,用 -j 参数; 所有的都需要时,用 -a 参数, 这样就可以随意组合了。

oldmanpushcart commented 6 years ago

主要是THREAD_STATE是瞬时状态,我平时核对jstack消耗过多的CPU的时候就会经常发现,一些wait的线程消耗CPU 也是异常的高,只是恰好你跑命令的时候他出于wait状态而已。默认过滤掉,只留下runnable的,会不会给问题定位人员误会判?

rodbate commented 6 years ago

默认统计所有线程,会好点吧, 线程死锁比较重要的,可以突出?