探讨下jmeter压测过程中,客户端端口数量耗尽导致报错的问题解决办法
我们公司FinClip 是一款小程序容器,不论是移动 App,还是电脑、电视、车载主机等设备,在集成FinClip 小程序 SDK之后,都能快速获得运行小程序的能力。打开小程序的时候客户端从后台获取小程序等相关信息的时候需要调接口,所以客户端与后端交互的接口涉及到并发需求,以下是我在用jmeter压测过程中遇到的问题与解决的办法:
关于jmeter默认勾选的KeepAlive
首先,jmeter在创建http请求的时候,会默认勾选Use KeepAlive,这个地方的KeepAlive说的应该是TCP的KeepAlive,HTTP的通常是Keep-Alive,两种是完全不同的概念,具体的讲解参考www.jianshu.com/p/9fe2c140f…
jemter压测来说,客户端想要复用端口,KeepAlive必须勾选,如果不勾选,我们来看看会发生什么情况?
我启用1个线程循环调用10次请求,第一次客户端用的端口号是63531,请求完成之后客户端主动发起了断开连接申请,然后第二次请求又会采用新的端口63533来发起,这样会每次申请建立新的TCP连接,很消耗时间,压测出来的结果性能数据也是非常差的。所以要复用端口来进行压测的话,必须要勾选Use KeepAlive选项
线程组是否勾选Same user on each iteration,然后http请求Advanced下的Implementation采用默认的模式,也就是选择为空
先看不勾选Same user on each iteration的情况:
截图看出,第一次请求建立连接用的55160端口,请求完成之后客户端主动端口连接,然后又用55161重新建立连接;所以http采用jmeter默认的方式来请求的话,去勾选Same user on each iteration的情况下,仍然是短连接;
然后来看下勾选Same user on each iteration的情况:
从截图可以看出,两次接口请求都是复用的同一个端口59435,所以http采用jmeter默认的模式请求,勾选Same user on each iteration,可以实现端口复用,也就是长连接压测的效果。
线程组是否勾选Same user on each iteration,然后http请求Advanced下的Implementation采用HttpClient4模式
同样先看不勾选Same user on each iteration的情况:
从上面截图可以看出,首次请求采用了2个不同的端口,分别是61673,61676,采用HttpClient4,去勾选Same user on each iteration的情况下,仍然是短连接;
然后看下勾选Same user on each iteration的情况:
从上面截图结果可以看出,两次接口请求都是复用的62942端口,可以实现长连接压测效果。
线程组是否勾选Same user on each iteration,然后http请求Advanced下的Implementation采用Java模式
先看不勾选Same user on each iteration的情况:
从上面截图看出来,每次请求都是复用的63850端口,所以Java模式下,不勾选Same user on each iteration,也可以达到长连接压测效果。
然后再看下勾选Same user on each iteration的情况:
从上面截图看出来,每次请求都是复用的64829端口,所以Java模式下,勾选Same user on each iteration,也可以达到长连接压测效果。
结论
jmeter要想实现端口复用,长连接压测,可以有上述几种情况来实现: 首先,必须勾选Use KeepAlive。 1、http请求Implementation默认模式,勾选Same user on each iteration,可以实现。 2、http请求Implementation配置HttpClient4模式,勾选Same user on each iteration,可以实现。 3、http请求Implementation配置Java模式,不管是否勾选Same user on each iteration,都可以实现。