JAVA系统性能调优

  • 格式:docx
  • 大小:33.29 KB
  • 文档页数:5

一.调整JBOSS最大连接数.
配置deploy/jboss-web.deployer/server.xml文件,如下:
<Connector
port="80"
address="0.0.0.0"
maxThreads="256"
maxHttpHeaderSize="8192"
emptySessionPath="true"
protocol="HTTP/1.1"
enableLookups="false"
redirectPort="8443"
acceptCount="800"
connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding=" utf-8"/>
maxThreads:表示最多同时处理的连接数。

acceptCount:当同时连接的人数达到maxThreads时,还可以接收排队的连接。

其中主要修改两个参数maxThreads和acceptCount值。

增加maxThreads,减少acceptCount值有利缩短系统的响应时间。

但是maxThreads和acceptCount的总和最高值不能超过6000,而且maxThreads过大会增加CPU和内存消耗,故低配置用户可通过降低maxThreads并同时增大acceptCount值来保证系统的稳定。

下表罗列出了在不同并发情况下jboss参数与并发在线的一般关系。

二.调整JVM参数:
首先说明一下,根据JVM的工作原理,对JVM的性能调优的重点是垃圾回收(GC)和内存管理。

垃圾回收的时候会导致整个虚似机暂停服务(Web可以适当的停顿,但GUI停顿是客户无法接受的),因此,应该尽可能地缩短垃圾回收的处理时间,而且由于运行各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同。

根据会签平台目前应用服务器的配置:Linux 64Bit,2Core×2G,对JVM的参数调整如下:JAVA_OPTS="-Xms1500M –Xmx1500M -Xss256k
-XX:PermSize=128m -XX:MaxPermSize=128m
-XX:NewSize=512M -XX:MaxNewSize=512M
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/aaa/dump
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/usr/aaa/dump/heap_trace.txt"
下面对设置的各JVM参数做相关说明:
以上JVM的设置标准,并不代表目前系统就可以按这个标准来定,需要在系统一段时间后,观察系统的运行状况和GC的日志信息,再做相应的调整。

补充说明:
年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。

我们观察一下二者大小变化有哪些影响
●更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增
加每次GC的时间;小的年老代会导致更频繁的Full GC
●更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的
GC时间会更短;大的年老代会减少Full GC的频率
●如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对
象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。

但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:(A)本着Full GC
尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理(B)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC
的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。

但应该给年
老代至少预留1/3的增长空间
三.系统程序调优
主要根据我之前提供出来的《JAVA代码优化参考》对系统中已有代码进行了优化,并在后续功能开发过程中,参考优化方案中的代码编写方式。

四.数据库优化
索引优化:
以下列出需要设置索引的表及字段以前相关说明:
SQL优化:
1、类FlowDaoImpl.java中:
String hql = "from VMyinitiatesign where id.flowname ='"+signTitle+"' and erid='"+userId+"' and not id.status='revoke'";
String hql = "from VMyinitiatesign where id.filename ='"+fileName+"' and erid='"+userId+"' and not id.status='revoke' ";
优化原则:避免在索引列上使用NOT,当ORACLE优化器遇到NOT,会停止使用索引转而执行全表扫描。

2、类FlowDaoImpl.java中,查询待签列表:
String hql = "from VBacklog where id.status='no' and id.operateUser= '"
+ uid + "' order by id.contractcreatetime desc"; // 用视图查询优化原则:对于order by 子句中使用索上,有俩个限制:1、order by 中所有的列必须定义为非空;2、order by 中所有的列的索引类型必须相同;
注:在order by 中运用索上,排序会非常高效
3、类FlowDaoImpl.java中:
String hql ="from VMyinitiatesign where erid = '"+userId+"' and id.status in ('no','yes','refused') order by id.createTime desc ";
优化原则1:将in关键字换成exists,exists的效率比in高很多。

优化原则2:order by 使用索引的原则,order by 中所有的列必须定义为非空
注:数据库优化还会继续补充
五.性能和压力测试
前段时间通过学习使用LOADRUNNER这个性能和压力测试工具,目前已基本了解该软件的使用,比如:录制脚本、脚本的参数化、设置事务、设置集合点(为了模拟更真实的并发)、运行场影、设置场影计划、生成分析报告等等。

接下来需要做的就是根据我们系统预计将来的使用量和业务功能使用方式,编写详细的测试计划,确认系统并发用户数量、请求响应时间、吞吐量等,来做更真实的系统进行压力和性能测试,并最终生成性能和压力测试报告。

最后我们就需要根据生成的性能和压力测试报告,进行分析,如:CPU、内存、系统I/O、网络I/O的使用情况等等,来确定系统的真正瓶颈所在,并制定出具本的优化方案。