总结:通过这次压力测试,增加了对程序的理解;假定正常情况下方法执行时间为2秒,吞吐量为100/s,则并发为200/s;假设用户可接受范围为10s,那么并发量可以继续增加到1000/s,到这个时候一切还都正常,若想继续提高并发量,我们可以优化吞吐量,增加tomcat的线程数和mysql的连接数;当吞吐量和并发量都达到一定程度,我们的JVM已经爆仓,则到了java开发最喜欢的JVM调优环节。
本着压测结果不能超脱实际情况裸奔的前提,压测参数在特定情况下参照:
1.接口最大响应时间(时间太长,客户要发彪);
2.带宽大小(线上机器带宽被运维限制,你想飞,飞不起来;内部带宽大小最好通知运维人员,防止影响路由其他业务);
3.CPU(CPU爆顶,影响运维,和运维人员商定高峰CPU值)
4.JVM(JVM溢出还想啥啊,优化程序或者考虑加机器分流)
5.mysql连接数(mysql默认最大可以达到16384,安装完默认为100,一般运维人员会根据需要进行更改,考虑多业务同数据库或者集群部署的问题,请一定听从运维人员的建议)
6.待研究补充。
JVM监控使用的是java自带jvisualvm.exe,在java安装目录jdk1.*/bin下;
使用教程:
1.服务器先要添加jmx用户名和密码,我的主机为linux,把jdk*/jre/lib/management/jmxremote.password.template文件拷贝到工程目录中(方便jvm参数配置);
-
cp /apps/jdk1.8.0_112/jre/lib/management/jmxremote.password.template /apps/dt/
-
mv jmxremote.password.template jmxremote.password
-
vim jmxremote.password
2.编辑jmxremote.password最下面两个用户#打开,如果想增加用户或者修改用户名需要在jmxremote.access声明权限才可以访问到。
chmod 0400 jmxremote.password
3.编辑项目的sh启动文件或者tomcat的catalina.sh,JAVA_OPTS中添加如下参数(注意参数之间的空格分开)
-
-Xms2g -Xmx2g -XX:PermSize=64m //jvm内存参数,请百度。
-
-server
-
-Dcom.sun.management.jmxremote.ssl=false //是否使用ssl
-
-Dcom.sun.management.jmxremote.port=10090 //jmx监控端口
-
-Dcom.sun.management.jmxremote.password.file=jmxremote.password //远程监控用户和密码文件
4.启动java项目,服务器工作就已经完成了。在本地打开jvisualvm.exe,添加远程主机,添加JMX监控,端口必填,用户名和口令需要和服务器上的jmx用户一致。
jmeter请到apache jmeter官网下载,下载完成,本地编写jmx测试脚本(如何编写请自行百度)
流程:
1.将编写好的jmx发送到linux服务器,linux下载jmeter包或者上传本地的jmeter。
2.配置jmeter命令,方便执行脚本;
-
vim /etc/profile
-
-
export JMETER_HOME=/dt/apache-jmeter-3.1
-
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
-
export PATH=$JMETER_HOME/bin:$PATH
-
-
-
source /etc/profile
-
jmeter -v
3.执行jmx脚本,并记录测试日志jtl文件。
jmeter -n -t 测试.jmx -l log.jtl
4.把log.jtl拿到本地在jmeter中各种报告导入查看。
一、测试目的、准备及条件
- 测试目的:得到我们的程序最优最大并发量,机器吞吐量(处理速度),带宽、计算力、JVM内存等情况,方便后续程序调优,方便后续给出运维建议。
- 准备及条件
- 测试机配置:
操作系统 |
CentOS release 6.8 |
CPU |
Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz |
内存 |
4G |
带宽 |
本机部署,本机测试,带宽忽略 |
IP |
192.168.1.149:11090 |
路由 |
包含上百台办公设备的路由 |
- JVM参数配置:
<pre class="has" name="code"><code class="hljs java">MEM_OPTS=<span class="hljs-string">"-Xms2g -Xmx2g -XX:PermSize=64m -server -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.password.file=jmxremote.password"</span></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre> </li> <li>数据库连接池:<span style="color:#f33b45;"><strong>如果压测程序依赖数据库数据操作,那么数据库最大连接数是影响压测性能的一个重要因素,连接池在单个程序中并不是越大越好,因为所有程序共享一个数据库,某个程序连接数沾满,会造成其他程序无法访问数据库。所以这里需要跟运维人员沟通后,在确认连接数的大小设置。</strong></span> <pre class="has" name="code"><code class="hljs python"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#最大连接数据库连接数,设 0 为没有限制</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">spring.datasource.max-active=<span class="hljs-number">20</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#最大等待连接中的数量,设 0 为没有限制</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">spring.datasource.min-idle=<span class="hljs-number">8</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#连接初始数量</span></div></div></li><li>