系统采用的常用框架 Mysql +SSM+Tomcat结构,测试工具使用的是Jmeter。
刚开始测试,并发量为200/s,居然错误率达到了15%,让我很郁闷。按Tomcat的性能200的并发量应该完全没问题,于是我搜了一下提高Tomcat并发量的资料,重新配置了一下,提高了Tomcat的性能。如下:
1.在Tomcat目录的bin/catalina.bat,打开这个文件,在前面添加一下配置
jvm在client模式,进行内存回收时,会停下所有的其它工作,带回收完毕才去执行其它任务,在这期间eclipse就卡住了。所以适当的增加jvm申请的内存大小来减少其回收的次数甚至不回收,就会是卡的现象有明显改善。
可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。
参数 描述
-Xms JVM初始化堆的大小
-Xmx JVM堆的最大值
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载 的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必 须重复地增加内存来满足使用。
由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用 有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值 的80%。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
JAVA_OPTS='-Xms【初始化内存大小】
-Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。
Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:
主要功能为JVM性能参数调优
rem 以下配置为JVM参数调优
set JAVA_OPTS=
-server rem 以服务器模式启动,启动速度慢,但更稳定,性能更好
-Xms8192M rem 由于本机内存为16G,这里就设置成8G(实际并未达到最大内存的80%)
-Xmx8192M rem -Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=64M rem 内存永久保留区域
-XX:MaxPermSize=300M rem 内存永久保留区域
-XX:+DisableExplicitGC rem 禁止System.gc(),免得误调用gc方法影响性能
-XX:MaxTenuringThreshold=31
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC rem 对年轻代采用多线程并行回收,这样收得快;
-XX:+CMSParallelRemarkEnabled rem 带CMS相关的是并发回收(CMS垃圾收集器)
-XX:+UseCMSCompactAtFullCollection rem 带CMS相关的是并发回收(CMS垃圾收集器)
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly rem 带CMS相关的是并发回收(CMS垃圾收集器)
-Djava.awt.headless=true
1).JAVA_OPTS'-Xms256m-Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分 析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很 快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的 大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过3-5秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详 细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的80%作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾 收集不是并行的。
2.打开conf/server.xml,并更改一下内容
maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
保存后,启动tomcat进行压力测试。结果最后错误率还是没有改变(这里其实Tomcat的并发性能已经提高了)
3.我想可能是mysql数据的连接问题,于是编辑了数据库连接文件datasource.properties,将最大连接数与最长等待空间编辑如下
#初始连接数
db.initialSize = 20
#定义最大连接数
db.maxActive = 200
#定义最大空间
db.maxIdle = 20
#定义最小空间
db.minIdle = 10
#定义最长等待时间
db.maxWait = 2000
db.defaultAutoCommit = true
db.minEvictableIdleTimeMillis = 3600000
最后测试结果,系统性能明显提高,并发量增大并且稳定
测试为每秒500次请求同一个接口,测试次数10次,5000次请求成功,且返回数据无丢失。
并发量500无压力,并发量800无压力。
当并发量达到1000时,查看结果报告,1000次中出现三次请求失败。
4.经过以上配置,提高了系统性能,并发量接近1000次/s