分布式java应用笔记系列---寻找系统系能瓶颈?也可以使用vmstat来查看,截图如附件????cpu消耗严重的时候,主
分布式java应用笔记系列---寻找系统系能瓶颈
?
也可以使用vmstat来查看,截图如附件
?

?
??
cpu消耗严重的时候,主要体现在cpu的使用率过高,其中包括us、sy、wa、hi的值变高(wa变高是io问题,如网卡接收数据)对于java而言,主要体现在us和sy两个参数上面:
?1.us过高主要原因是线程一直处于可运行状态(runnable),或者是频繁的GC所造成的。对于一直处于可运行状态的线程,可以适当采用使其睡眠的方法来处理,
????? 虽然睡眠使这个线程的执行效率变低,但是可以使cpu有机会来处理其他的线程。不会造成其他线程的“饥饿”,从而程序的整体运行水平提高
????? ★在top中根据pid找到使用率太高的线程12345,然后用jstack [pid] |grep 'nid=12345'来确定。需要多做几遍
????
?2.sy过高的主要原因是线程上下文的切换过于频繁。锁的使用出现了问题。同样用jstack -l[pid]的方法找到该线程
?????
===========================================================================================================================================
文件IO消耗分析
linux的系统,会采用cache的机制使用文件。这样就会发现linux的可用物理内存不是很多,但是cache所占得内存却很多(内存都被cache占用了)。
如果内存足够的话,那么只有第一次加载文件和写出文件会产生真正的文件IO,其他的情况都不会产生文件IO。JAVA中造成io大量消耗掉的原因主要可能为多个线程需要进行大量的内容写入写出(例如log的写入)。磁盘的本身处理速度慢
文件本身就很大(数据库数据量一大就会发生查询插入过慢)。?1.使用pid -t -d -p[pid]1 100,如果不知道pid的什么,就直接pid -d -t直接查看文件IO的使用情况
如图: 查找到占用资源高的pid即可
?

?
2.使用iostat,截图如下
?

?
===========================================================================================================================================
网络IO消耗
可以使用sar -n FULL 1 2命令查看网络IO的情况,或者使用tcpdump来查看
但是一般的java应用并不会产生大量的网络IO===========================================================================================================================================
内存消耗分析:
目前的java只有在创建线程和DerectByteBuffer的时候才会在JVM堆以外的JVM内存(其中创建线程实在JVM方法栈上,DerectByteBuffer消耗JVM以外的物理内存)。
其中对内存的消耗关注点主要集中在两点
第一:对JVM以外的内存消耗关注(Swap区的消耗和物理内存消耗):
?采用vmstat命令,管关注memory下的swpd、free、buff、cache、以及swap下的si和so
??★swpd是虚拟内存已经使用了的部分kb
??★free表示空闲物理内存
??★buff表示缓冲内存
??★swap下的si是每秒从disk读入到内存的数据量,so为写入disk的
?还可以采用sar命令
?但是貌似是pidstat -r -p [pid] 1 100比较好
第二:对JVM以内的内存消耗关注:
?这个参考一下jvm的内存分配机制就自然明白了,主要是对象和GC之间的矛盾===========================================================================================================================================
程序资源消耗正常,但是程序的执行速度很慢分析
1.锁竞争激烈,常见的有数据库连接池。10个大小的池子,如果有50个线程来链接,那么就必须有40个等待了
2.没有充分使用硬件资源。能够多线程操作的东西却一直在使用单线程
3.数据量的增长。例如数据库的数据文件太大。尝试去使用Jprifiler这个商业工具。。。?总结命令:
top?jstat pidstat vmstat iostat jstack