生产环境处理问题小结:
顺着上边的思路,我回家看了一些资料,资料表明当性能出现问题的时候无外乎从四个大的方面入手:CPU、内存、文件IO、网络IO。
我们可以使用TOP命令可以来分析当前CPU使用情况。在TOP中分别有:us、sy、wa、hi这4个指标,这4个指标分别代表是:
1、 cpu:应用消耗,当us高的时候一般是我们代码问题,比如代码中出现了象这次故障的死循环,或许还有可能是纯粹计算或者FullGC遇成。
2、 sy:linux系统消耗,当sy高时证明系统在花大量时间做线程切换,证明我们Java应用中启动了大量线程,并且这些线程都处于阻塞状态和执行状态的切换过程(锁等待、IO等待)
3、 wa:代表的是IO等待,当wa高可能是由系统或者应用造成,应用造成wa高一般是由多个线程同时对一个文件进行大量写入,或者是磁盘本身就有问题了,还有一种情况是写入的文件本身非常大等造成的。
4、 hi:硬件中断造成的,例如网卡接收数据频繁。
网络IO:Java在网络通信时,一般会先将对象序列化为字节流,进行发送,或者是接收字节流并反序列化,这个过程要消耗JVM的堆内存,按资料上的意思是JVM的堆内存大小是有限的,所以一般不会造成网络IO的严重消耗。
以上几种情况 ,我们都可以借助Jstack工具把JVM的线程给Dump出来,可以分析那些线程在等待,那些线程在IO读写,那些线程在死循环。
还有一些其它的工具可以帮助我们详细的分析这些状况:pidstat、iostat、sar 、jmap等
当出现问题的时候,我们可以根据某一个指标的数值去有方向的定位问题。
参考资料:毕玄的分布式Java应用 第五章,书上写的比较详细,并且有实际案例性能调优,大家有时间可以详细看一下。