如果 jmeter 达不到预期的性能指标,可查看压测机器的性能,是否因为内存、网络、cpu 占用导致的瓶颈。
压测的线程数过多时,或者线程没有及时释放,会导致 TCP/IP 连接端口已达到最大限制,jmeter 会报错
【报错信息】Non HTTP response code:java.net.BindException
【原因分析】windows 提供给 TCP/IP 连接的端口号是 1024-5000,并且要四分钟左右循环回收,这就导致我们短时间内频繁调用大量请求时,端口号被占满
【解决方案】修改系统的最大端口连接数
TCP 客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起 3977 个 Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)
【异常现象】大量请求出现连接失败,或者压测的错误率异常高,但服务器性能并没上去
【原因分析】线程数已达到瓶颈
【解决方案】循环创建线程,勾选 keep-alive(一般默认是勾选的),可复用线程,即一个 http 请求处理完之后,另外一个 http 请求会从这个连接走
【异常现象】jmeter 安装目录下产生大量很大的.hprof 文件
【原因分析】这种.hprof 文件的产生是内存泄漏引起的
【解决方法】
windows 环境下,修改 jmeter.bat:
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改为:
set HEAP=-Xms256m -Xmx1024m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
PS:heap 最多设置为物理内存的一半,默认设置为 512M.如果 heap 超过物理内存的一半,可能运行 jmeter 会慢,甚至出现内存溢出,原因 java 比较吃内存,占 CPU.
1、定期清理 jmeter 生成的日志文件:jmeter.log 和 jmeter-server.log(安装目录下)
2、压测线程数过大时,可采用分布式压测,以命令行执行方式,别使用 GUI 方式压测
TPS:事务数/秒 一个事务可能包含多个查询
QPS:查询数/秒(每秒响应的请求数)
QPS(TPS):每秒钟 request/事务 数量
并发数: 系统同时处理的 request/事务数
QPS(TPS)= 并发数/平均响应时间
比如说报错率在某一次中超过了预期,则该值时已经存在性能瓶颈;tps 达到某一值时,不升反降,则该值存在性能瓶颈;响应时间的值开始缓慢增加后来剧增,则达到性能瓶颈