JMeter高并发压测实战:五大典型问题与优化策略

张开发
2026/4/10 15:16:42 15 分钟阅读

分享文章

JMeter高并发压测实战:五大典型问题与优化策略
1. 端口耗尽当TCP/IP连接说我累了第一次用JMeter做高并发压测时我最先遇到的拦路虎就是那个让人摸不着头脑的报错Address already in use。当时压测到3000并发就卡壳后来才发现是Windows默认只给开放了3976个临时端口1024-5000而且回收机制像老式公交车一样慢——要等4分钟才能循环使用。实测有效的解决方案分三步走打开注册表编辑器WinR输入regedit找到这个路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters新建DWORD值命名为MaxUserPort值设为65534十进制记得改完一定要重启有次我偷懒没重启折腾两小时才发现问题。如果是Linux系统修改更简单echo 1024 65535 /proc/sys/net/ipv4/ip_local_port_range sysctl -w net.ipv4.tcp_tw_reuse12. 线程瓶颈别让线程池成为性能天花板去年给某电商做618压测时明明服务器配置足够但错误率突然飙升到15%。后来用jstack工具分析发现线程池满了导致请求排队。JMeter默认的线程模型就像早高峰的地铁——如果不控制人流站台就会挤爆。优化线程池的实战技巧在HTTP请求高级设置里勾选Keep-Alive相当于让线程拼车回家调整jmeter.properties中的这些参数httpclient4.retrycount1 httpclient4.idletimeout2000 httpclient.timeout10000对于Java应用建议用这个公式计算合理线程数线程数 CPU核心数 * (1 平均等待时间/平均计算时间)有个容易忽略的细节如果测试RESTful API记得关闭JMeter的从HTML文件获取所有内含资源选项否则每个CSS/JS请求都会占用独立线程。3. 内存泄漏当.hprof文件吞噬你的硬盘最惊悚的经历是某次压测后发现C盘突然少了20G空间——全是JMeter生成的.hprof内存快照文件。这些内存黑洞通常由两个原因导致JMeter自身内存设置不合理被测程序存在对象未释放三管齐下的解决方案修改jmeter.bat启动参数Linux是jmeter.shset HEAP-Xms4g -Xmx4g -XX:MaxMetaspaceSize1g添加内存监控到测试计划jmeterTestPlan hashTree ResultCollector guiclassStatVisualizer testclassResultCollector/ /hashTree /jmeterTestPlan用VisualVM监控被测应用重点观察Old Gen区内存曲线建议压测前先用10%的并发量做预热测试就像长跑前要先热身。曾经有个Spring Boot应用在Full GC时卡死就是因为没预热导致缓存雪崩。4. 带宽限制看不见的性能杀手给某视频网站做压测时遇到个诡异现象JMeter报告大量超时但服务端日志却很干净。后来用iftop工具才发现测试机的1Gbps网卡已经被打满。带宽瓶颈就像高速公路的收费站——车流量超过设计值就会堵车。带宽优化组合拳在JMeter的HTTP请求中启用压缩httpclient4.accept_encodinggzip httpclient4.content_encodinggzip分布式压测时控制单个控制机管理的负载机不超过10台用-J参数调整采样间隔jmeter -Jjmeterengine.force.system.exittrue -n -t test.jmx对于大文件上传测试我习惯先用tc命令模拟限速环境tc qdisc add dev eth0 root tbf rate 100mbit burst 32kbit latency 400ms5. 分布式压测如何让多台机器协同作战第一次尝试分布式压测时5台负载机只有3台能连上控制机。后来发现是防火墙阻止了RMI通信。JMeter的分布式架构就像军事演习——各部队必须使用相同的作战地图。必须掌握的分布式要点所有机器必须在同一子网且关闭防火墙systemctl stop firewalld # CentOS ufw disable # Ubuntu修改jmeter.properties中的远程主机配置remote_hosts192.168.1.101:1099,192.168.1.102:1099 server.rmi.ssl.disabletrue控制机启动时添加RMI参数jmeter -Djava.rmi.server.hostname192.168.1.100 -s -j jmeter-server.log有个真实案例某次压测中8核16G的负载机只能支撑1200并发后来发现是JMeter默认的RMI序列化方式效率太低。改用二进制协议后性能提升40%jmeter.rmi.serializationjava

更多文章