通过压力测试提升服务器并发性能实例

时间:2021-11-17 08:52:13

前言

前一段时间应领导要求,对公司服务端代码进行简单的压力测试。测试发现,并发数只能维持在很小的值以内,比如模拟并发数超过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

公众号

每个正常工作日,我都会更新一篇有价值的技术文章。每天进步一点点,积少成多。欢迎关注。
通过压力测试提升服务器并发性能实例