转: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处理
分享到:
相关推荐
微信小程序+java服务端 微信小程序中实现:电商的主业,商品页面,分类页面,购物车页面,地址页面,订单页面。 java服务端中实现:对以上数据的支持功能。 下一次带实现的功能:微信支付功能,订单接入功能,物流接...
实现Java服务端和C#客户端联通 Java使用Netty 开发环境为IDEA C#使用DotNetty 开发环境为VS2017 运行时先开启Java服务端 再开启客户端
JAVA服务端研发知识图谱_源码 JAVA服务端研发知识图谱_源码 JAVA服务端研发知识图谱_源码
ios 推送 java 服务端程序 ,与苹果的Apns服务打交道,作为ios客户端程序的服务端(provider)。
完整源码 delphi客户端+JAVA服务端
Java 实现HTTP BasicAuth服务端代码,压缩包为Eclipse工程,导入即可运行
网上找的MQTT服务端的实现,代码有基本注释,自己研究一下
关于一个老话题,Java服务端+DELPHI客户端
个推工具类(java服务端),做推送使用,调用里面的方法,做推送
Java服务端 Android客户端通信 Eclipse Netty 4.0.35
delphi客户端连接JAVA服务端.采用XML中间传输
简单的一个使用java servlet写的服务端程序
通过java实现tcp客户端发送,服务端解析程序,并处理其他业务如发送KafKa,存储数据库等,服务器穿透等
java的服务端程序(多线程)和客户端程序 Demo
一个Java聊天程序服务端和客户端程序,C/S结构,ChatServer 类实现了一个聊天室服务器端, 此类有一个构造器, 在构造器中使用newServerSocket()建立一个Socket 连接。RunServer()方法中运行聊天服务,通过Socket 类...
Java服务端框架 服务器框架 java服务器框架模板
java服务端推送消息给ios客户端,有兴趣的朋友可以看下
android聊天室的源码,里面有两个文件,一个是ChatUIServer2.7z,是java服务端的打包文件,用idea写的,里面有src,out,.idea.ChatUIServer2.iml四个文件;第二个是UIChat2.zip,是android服务端的打包文件,用android...
本程序是java开发webservice服务端程序,内包含所需基础jar包,内部逻辑代码需自己实现。发布后可直接访问。
新手入门参考,包含idea,jdk1.8,tmcat9