在配置 jmeter 分布式测试时,我遇到了远程连接到 NAT 后面的服务器的问题。带有 jmeter 客户端的节点具有外部 IP,所有服务器都位于 NAT 后面的不同 LAN 中,无法直接进行端口转发。
我决定尝试 SSH 隧道。
在服务器上:
> jmeter-server -Djava.rmi.server.hostname=127.0.0.1
> ssh -N -f -R 55500:127.0.0.1:55500 -R 55501:127.0.0.1:55501 -L 60000:127.0.0.1:60000 jmuser@client_node_ip -p 5000
在客户端:
> jmeter -n -t testcase.jmx -l testcase.jtl -Djava.rmi.server.hostname=127.0.0.1 -r
在并发 VU 数量较少的情况下(10-100),测试成功。但是当我指定更多 VU 时,SSH 隧道失败并出现以下错误:
accept: Too many open files
open failed: administratively prohibited: open failed
Write Failed: broken pipe
我看到端口 60000 上有许多连接。服务器和客户端节点上的 ulimit 值相当高 = 1000000。
有什么解决方法吗?
答案1
我要检查三件事:
- 监控应用程序在测试期间打开的文件数。有多种方法可以做到这一点,但我只计算目录树
/fd
中进程子目录中的条目/proc
。如果您的应用程序在完成后没有正确关闭文件句柄,则可能会发生这种情况。 - 检查
ulimit
打开的文件,您拥有的值对于该限制来说非常高。通常,它的默认值约为 1024,而 65536 非常高。 - 监视端口 60000 上已建立的连接数。这些连接将计入打开文件限制。
如果隧道出现故障,则可能是 ssh 服务器或 ssh 客户端出现故障。修复 ssh 服务器的打开文件限制可能比修复 ssh 客户端的打开文件限制更困难。
您可以使用多个隧道来解决此限制。这将使您的 jmeter 脚本稍微困难一些,因为您需要跨隧道分散连接。