阅读更多
转:http://blog.sina.com.cn/s/blog_4fb490ff0100l0cd.html
做java服务器端性能测试的时候发现无论再怎么增大并发线程数,CPU使用率在达到70%左右以后就再也上不去了。用来做测试的服务器是双四核CPU,所以一共有8个核心。而上个版本做性能测试的时候用的是双dual core的服务器,所以是4个核心,那个时候CPU使用率跑到了90%左右。为什么随着CPU核心数量的增加,CPU的使用上限反倒下降了呢?
服务端程序一般都是多线程的,Java的线程状态有NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED这几种。只有线程处在RUNNABLE状态的时候才会消耗CPU资源。所以要监视服务端Java的线程状态,并且找出那些频繁处于BLOCKED,WAITING状态的线程是停在代码的哪个位置。
对Java进行性能监视的时候jconsole是常用的工具。这里推荐另外两个工具,VisualVM和tda。VusualVM是jdk自带的工具。在windows版的jdk的bin目录下的jvisualvm.exe就是。tda一会儿再说明。首先说一下VisualVM是如何监视线程的状态的。打开VisualVM以后本机所有的JVM进程就都显示出来了,选中任何一个进程就能够开始监视。如果想要监视远程的JVM进程就需要对方开了JMX服务端口。开启JBoss的JMX服务端口的参数例子:
JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.1.2
下面这张图是VisualVM对JBoss的JVM进行监视的例子。
Java的服务端程序性能问题调查方法
在thread tab里面可以观察JVM里面每个线程的状态。注意右下角running,sleeping,wait,monitor这4个状态。对于web处理来说最主要的是http线程池。这些线程状态如果处于黄色(wait),说明来自外部的压力测试负荷不满。这种情况下就要考虑外部压力不够的原因了。比如网络状况等等。如果线程状态频繁处于红色(monitor)。说明线程频繁的处于BLOCKED状态,这就需要注意了,可能是线程代码里面某个synchonized代码段或者synchronized方法造成的。或者是一些需要串行化的方法造成的。总之就是程序本身有问题了。在Tread tab窗口的右上角有一个thread dump按钮,按下之后就会把当前各个线程的状态dump下来。如下图。
Java的服务端程序性能问题调查方法
如果线程很多,这个文件非常的不好读,这时候就用到TDA(Thread Dump Analyzer)了。把dump下来的内容存成文件,或者保存到剪贴版里面以后就能够在TDA里面打开了。
Java的服务端程序性能问题调查方法
上面的例子里面可以看到这个工具可以很方便的查找dump文件里面每个线程的相关信息。在这里查找那些处于BLOCKED状态的线程,然后就能查看到当前被block在那里了。
总结一些在容易对CPU使用率造成影响的因素。
需要串行化的处理,包括log文件的输出,数据库的输出,网络的输出
synchronized语句关联的处理
GC处理