线上服务 CPU 100%?一键定位 so easy!
0、背景 经常做后端服务开发的同学,或多或少都遇到过 CPU 负载特别高的问题。尤其是在周末或大半夜,突然群里有人反馈线上机器负载特别高,不熟悉定位流程和思路的同学可能登上服务器一通手忙脚乱,定位过程百转千回。 对此,也有不少同学曾经整理过相关流程或方法论,类似把大象放进冰箱要几步,传统的方案一般是4步: top oder by with P:1040 // 首先按进程负载排序找到 axLoad(pid) top -Hp 进程PID:1073 // 找到相关负载 线程PID printf “0x%x\n”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备 jstack 进程PID | vim +/十六进制线程PID - // 例如:jstack 1040|vim +/0x431 - 但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,有没有可能封装成为一个工具,在有问题的时候一键定位,秒级找到有问题的代码行呢? 当然可以!工具链的成熟与否不仅体现了一个开发者的运维能力,也体现了开发者的效率意识。 淘宝的oldratlee 同学 就将上面的流程封装为了一个工具: show-busy-java-threads .sh(点击可直接下载,或参考文末链接下载),可以很方便的定位线上的这类问题,下面我会举两个例子来看实际的效果。