jmeter压力测试报错
用jmeter 压力测试GPU版本的模型服务时,发现增加jmeter线程数(20个线程时),在压测的后半段会报错,进去查看结果树发现这样的错误:
Response code:Non HTTP response code: java.net.NoRouteToHostException
Response message:Non HTTP response message: Cannot assign requested address (Address not available)
网上查资料发现,说是linux服务器的临时端口不够用了。
jmeter访问http协议的模型服务的时候,实际上jmeter的每个请求都以一个线程的形式存在,http connection连接了客户机和运行模型服务的服务器,客户机和服务器这两台机器都会用各自的一个临时端口号来唯一标识这个http连接,在请求完成之后,服务器和客户端才会释放、回收这个临时端口,供后续使用。问题在于客户端、服务器的临时端口号都是有限的,不能无限获得。可用的端口号在客户机、服务器都有配置,保存在这个文件中:/proc/sys/net/ipv4/ip_local_port_range
可以通过cat 命令来查看:
cat /proc/sys/net/ipv4/ip_local_port_range
我用的服务器显示的结果是:
10000 65000
代表可用的端口号范围是10000-65000,共55000个端口号。
而在客户端linux系统上,这个文件中的结果为
32768 60999
也就是客户机上说只有28232个端口可用,在jmeter压测过程中,如果同时打开的http连接数量超过客户端、服务端两者的最大可用端口数中的较小值时,即
min(客户机的最大可用端口数,服务器的最大可用端口数)
jmeter就会报上述错误。
而我在压测过程中,当jmeter线程数设置为15时,就很少报这个错,是因为15个线程压测时,不容易同时打开这么多HTTP连接,超过最大可用端口号的数量,因此很少报这个错(当然也有报错过,但比较少见)。解决办法就是如下参考链接中说的,在客户机和服务端机器上都进行以下设置(注意客户机、服务器都要设置,亲测如果只设置服务器,还是会报错)tcp协议中的3个变量(其中第3个有些操作系统没有,可不设置)
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
果然,修改配置后再也没有报过上述错误,即便jmeter线程数增加到100。