JMeter并发测试遇到Socket closed错误解决方案
Intro
最近在用 JMeter 测试服务的性能,并发测试的时候,当线程数超过500,就会出现 socket closed 的错误,在网上查阅了一番资料之后,找到了下面的解决方案:
- 第一步,调整默认文件数
- 第二步调整HttpClient的Idletimeout
Solution
调整文件数
怎么在Windows上配置,找了几种方式都不行,最后在 git bash 里执行了linux 下的命令,也可以查看和修改
查看默认限制数配置:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1418
virtual memory (kbytes, -v) unlimited
可以看到我的电脑上默认的文件数是 256,下面我们来修改默认文件数
ulimit -n 2048
-n 后面的参数就是要指定的大小,可以根据自己的电脑的配置进行调整,配置好的可以改的更大一些
如果上面执行完没有报错,然后在执行 ulimit -a
查看配置就会发现文件数已经修改为了指定值,如果有报错可能就是数值设置的太大了,可以调整一下,需要是 2 的指数(如256,512,1024,2048,4096...)
调整HttpClient的idletimeout配置
问题原因:在JMeter下,发送http 请求时,一般都是默认选择了use keepAlive
,JMeter坑就在这里,默认勾选了这个(如果不勾选的话,也不会保存),但其配置JMeter.properties中的时间设置默认却是注销的,也是是说,不会等待,一旦连接空闲,则立马断开了,导致我们压测中出现了事务失败的情形。
解决办法:修改 jmeter.properties
中的 httpclient4.idletimeout=<time in ms>
设置成自己觉得合理的时间,一般可设置成10-60s(表示连接空闲10s后才会断开),注意这边单位是ms。
网友评论