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

smelody · October 18, 2019 · Last by big9sun replied at October 22, 2019 · 1244 hits

有个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)都无效,还有就是上面老兄说的设置超时时间了,全都无效,线程数到了五百(或者请求数在一分钟内达到六万多)就报错,谁有一劳永逸的方法

6Floor has been deleted

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

jacksboy 回复

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

smelody 回复

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

smelody #10 · October 21, 2019 作者
槽神 回复

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

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

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

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

jacksboy 回复

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

14Floor has been deleted
jacksboy 回复

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

smelody 关闭了讨论 22 Oct 11:05
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up