前言
前一段时间应领导要求,对公司服务端代码进行简单的压力测试。测试发现,并发数只能维持在很小的值以内,比如模拟并发数超过100,失败率就会大大提高。
在咨询完后端搭建过程后发现,基本上所有的配置参数全部采用了默认处理,包括:数据库、服务器、应用程序。然后就是各种查资料,发现上述提到的各个模块都有很大的提升空间,需要开发人员自己配置。这一块网上众说纷纭:有的说改tomcat配置的(配置堆内存大小,jvm参数,IO流处理方式等);改连接池参数的(最大连接数、最小连接数、增值单位大小等)、改数据库参数的(mysql工作模式、连接数等);提升服务器硬件配置(这个纯属扯淡,每个模块没有发挥出最大性能,仅仅提升硬件配置也是没有的)。
以下是测试实例,通过一步一步修改各个模块的参数,找到了影响并发量的关键问题,其中学到了很多知识。总结在最后。
测试环境
- 服务器:tomcat7
- 数据库:mysql5.5
- 连接池:c3p0
- jdk:jdk7
压力测试工具jmeter的使用
- 详细使用请自行查资料,这里只介绍用到的模块,可以满足需求。
-
使用步骤以及使用模块如下
1 添加测试组
2 模拟用户参数设置
3 添加模拟请求接口
4 配置接口参数
5 添加实时测试概述(可以查看错率率)
6 添加查看结果树(可以查看错误原因)
7 启动与停止
测试并发阀值
测试发现只要并发数大于100,失败率一下子就会提上去;如果要小于100,失败率基本上接近于0。由于当初没有找到jmeter的【查看观察树】模块,也不知道错误的原因,只能凭感觉去猜测错误原因。第一步想到的就是tomcat的参数原因。
尝试优化一:修改tomcat配置
一、Tomcat 本身优化
之前文件介绍过的 Tomcat 连接器的三种方式: bio、nio 和 apr,三种方式性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 使用的 Connector 默认就启用的 Apr 协议,但需要系统安装 Apr 库,否则就会使用 bio 方式。
- 改为nio,Tomcat安装目录/conf/server.xml,修改以下参数
修改之前:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改之后:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
二、JVM 优化
对于tomcat中jvm内存默认大小众说纷纭,有的说Tomcat默认可以使用的内存为128MB;有的说Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。没有找到确定说法。以下是修改jvm参数的方法:
使用startup.sh 启动tomcat的解决方法
修改 TOMCAT_HOME/bin/catalina.sh
在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行:
JAVA_OPTS=”-server -XX:PermSize=512M -XX:MaxPermSize=1024m”
重启tomcat
测试结果
测试结果表明,对于IO模式的修改对并发量有一定的提高,但是很少(当时测试,从并发100提升到了150,如果再提升并发数,失败率就会上升)。对于jvm内存大小的提升,对并发量的提升没有作用。
尝试优化二:修改连接池参数
-
参数解释
houseKeepingSleepTime:自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 。
houseKeepingTestSql:如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。
maximumConnectionCount: 最大的数据库连接数。
minimumConnectionCount:最小的数据库连接数。
simultaneousBuildThrottle:可一次建立的最大连接数,增量单位,默认是10。
prototypeCount:连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立(假设没有超过最大可用数).例如.我们有3个活动连接2个可用连接,而我们的prototype-count是4,那么数据库连接池将试图建立另外2个连接.这和 minimum-connection-count不同. minimum-connection-count把活动的连接也计算在内.prototype-count 是spare connections 的数量. -
默认参数:
houseKeepingSleepTime=90000
houseKeepingTestSql=select CURRENT_DATE
maximumConnectionCount=100
minimumConnectionCount=10
simultaneousBuildThrottle=10
prototypeCount=5 -
修改后参数
houseKeepingSleepTime=90000
houseKeepingTestSql=select CURRENT_DATE
maximumConnectionCount=1000
minimumConnectionCount=100
simultaneousBuildThrottle=100
prototypeCount=50
测试结果
测试结果表明,修改上述连接池参数仍然不能提升并发量,仍然维持在100,并发量再大,失败率就会提高。
尝试优化三:修改mysql最大连接数
-
查看mysql最大连接数
通常,mysql的最大连接数默认是100, 最大可以达到16384。查看最大连接数:
show variables like '%max_connections%';
-
修改mysql最大连接数
进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MySQL即可。
-
查看是否修改成功
show variables like '%max_connections%';
测试结果
测试结果表明,最大并发量有了很大的提升,基本可以达到1000(提升了10倍!),并且失败率不会提升(前提是项目连接池也修改了)。
总结
提升并发量主要需要修改两块地方:项目连接池最大连接数量;mysql最大连接量。
通过以上测试发现,影响并发量的关键因素在mysql默认的连接数与项目连接池的最大连接数(注意,连接池的最大连接数不要超过mysql的最大连接数)。其它地方参数的调整只能说是“优化”服务器,并不能从根本上提高系统的并发量。
在调优的过程中,压力测试工具Jmeter起到了很大的作用。在该工具的帮助下,可以模拟多用户高并发访问服务器,模拟环境;并且可以记录出出错的原因,根据错误原因,进行分析,找出问题所在。
这里并不是说其它参数不重要,而是总结出影响并发量的关键因素。其它如jvm内存的调整、IO模式的调整在程序处理海量数据时、项目过大时都是需要考虑的关键因素。
Jmeter3.1下载
http://download.csdn.net/detail/wgyscsf/9745450
公众号
每个正常工作日,我都会更新一篇有价值的技术文章。每天进步一点点,积少成多。欢迎关注。