作为一个开发人员,如果你不知道debug那就太low了,在开发过程中我们经常会使用到到一个技能,如果你能很好的使用这个技能,会让你少掉几根头发(延缓几年变成秃子^_^),debug是一把好剑,在初期的时候,如果你可以把它用的很6,那你在工作中就可以如鱼得水,走的比较顺,但是,我们不能过度的依赖debug,我们应该在使用debug的过程中学会的分析软件产生问题的地方,是什么原因导致了这个问题,这才是终极目标,做到手中无剑,心中有剑的最高境界,就像刘欣老师在他的一篇文章《不加断点调试的程序员是好程序员》一样:http://user.qzone.qq.com/14703250/2。
在开发阶段IDE提供了debug这个神器,能让我们定位问题变得更加容易,但是在真正的生产环境还是会发生许多我们无法预知的故障,你不可能在生产环境上 去装一个eclipse去debug吧,好吧,我们还有秘密武器,可以查看日志记录,可是如果某些故障发生在我们没有记录的地方呢,哈哈,傻眼了吧。
下面记录了前辈就一个实际的生产故障进行问题的分析定位的过程:
问题:高CPU占用
根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障,图例如下:
通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,接下来怎么定位到具体线程或者代码呢?
然后将需要的线程ID转换为16进制格式:printf "%x\n" tid
最后通过 java 自带的故障分析工具 jstack 抓取线程快照:jstack pid|grep tid -A 30,找到有问题的JAVA代码,进行业务调整和编码修改
总结排查CPU故障的方法和技巧 :
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。