问答 jmeter 的 http 请求总是短连接?

鸣虫 · 2019年10月18日 · 最后由 big9sun 回复于 2019年10月22日 · 6968 次阅读

有个 http 接口,jmeter 模拟并发,请求的时候,已经勾选了 use keepalive,而且看请求头也确实是这样的
Connection: keep-alive
Content-Length: 59906
Content-Type: text/plain; charset=UTF-8
Host: *****
User-Agent: Apache-HttpClient/4.5.7 (Java/1.8.0_131)

然后服务端也开启了 keepalive,通过抓包验证,如图

jmeter 设置了 1 个线程,但发现长连接没有生效,总是一次请求 - 响应后,客户端断开连接(注意是作为 jmeter 的客户端主动断开,不是服务端断开的),然后下次客户端再开一个端口,这是为什么?难道 jmeter 有什么坑?

共收到 13 条回复 时间 点赞

https://www.jianshu.com/p/9fe2c140fa52

https://www.cnblogs.com/shenh/p/10240714.html

问题原因:在 JMeter 下,发送 http 请求时,一般都是默认选择了 use keepAlive,这个是连接协议,JMeter 坑就在这里,默认勾选了这个(如果不勾选的话,也不会保存),但其配置 JMeter.properties 中的时间设置默认却是注销的,也是是说,不会等待,一旦连接空闲,则立马断开了,导致我们压测中出现了事务失败的情形。

解决:修改 httpclient4.idletimeout= 设置成自己觉得合理的时间,一般可设置成 10-60s(表示连接空闲 10s 后才会断开),注意这边单位是 ms。修改完成后再次压测,错误不再有了。

恒温 回复

这个方法我试了,不行,在 jmeter.property 文件改 httpclient4.idletimeout=10000,重启 jmeter,然后 http sampler 里参数也改了

你对于长连接的理解貌似有误,长连接是在整个 session 会话的过程中,不需要频
繁发起请求而已,会话结束,长连接结束。

jacksboy 回复

对于我这里的 jmeter 设置,只有 1 个线程,也就是一个用户,每秒一个请求,长连接应该是第一次请求时建立的连接,可以被后面的这个线程发起的每次请求复用,服务端和客户端的端口不变,不是吗?

端口不够用的问题一直没解决,参照网上说的改注册表(端口数设成 65543,tcp 等待时间设置为 5,0,3 秒都没用,有个问题,加参数时选的十进制,但是保存后自动变成勾选十六进制,不知是否真的设置成功了),改 property 文件 (httpclient.reset_state_on_thread_group_iteration=false) 都无效,还有就是上面老兄说的设置超时时间了,全都无效,线程数到了五百(或者请求数在一分钟内达到六万多)就报错,谁有一劳永逸的方法

11楼 已删除

smelody 基本概念你都没弄清楚,去看看 jmeter 里面线程是什么概念,跟 session 什么关系

jacksboy 回复

我确实查了,一个 thread,如果勾选了 use keepalive,那就是长连接,如果连接一直非空闲,那客户端或服务端就不会发出关闭连接的信号,也说说你的理解嘛,请指正。

鸣虫 回复

你应该用监控工具观察服务端的线程池和连接池是否有新增连接进来
后端服务起在固定端口上,不存在会出现新端口号的情况
但是客户端,JMeter 怎么用客户机的端口没读源码可能你也搞不清楚,就算 netstat 查出来 JMeter 有新的端口占用出来就能说明重新建立连接了?未必吧,虽然我也不懂,但是我觉得这样下论断可能为时过早,想搞清楚建议去读一下源码。

鸣虫 #10 · 2019年10月21日 Author
槽神 回复

你看第一次建立连接客户端开的端口是 65415

然后客户端主动向服务端发出了 TCP 的 FIN 标识,说明是客户端,也就是 jmeter 主动发出关闭连接请求,这个连接关闭后,接着,客户端又重新建立了一个端口为 65418 的连接

jmeter 调的也是 httpclient,就算勾选了 keepalive,线程池大小只开了 1,但是没办法阻止,当前线程执行完回到线程池之后,再去 new httpclient 对象的,新的 client 拿不到上一次执行的连接的。除非把 client 对象变成单例,但是单例在 http 请求过程中是有问题的。以上是我的猜测,没去翻 jmeter 源码,仅供参考。

一个请求之内 jmeter 可以做到长连接,这点不用怀疑.
就如上面林胖所贴的你自己也说了后面的请求,那都不是一个请求了怎么做到长连接

jacksboy 回复

你怕是混淆了 tcp 的长连接和 http1.1 的长连接的概念了

13楼 已删除
jacksboy 回复

好像是你弄错了长连接的概念

鸣虫 关闭了讨论 10月22日 11:05
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册