我ssh
在 macOS 上运行以将连接到本地 Unix 域套接字重定向到另一台机器上的域套接字。call的命令行ssh
大致如下:
$ ssh -nNT -L /var/run/some.socket:/var/run/some.socket -o TCPKeepAlive=yes \
-o ServerAliveCountMax=10 -o ServerAliveInterval=60 user@destination
在执行一些负载测试后,我发现有时某些客户端连接失败,并且在检查日志时,我发现在ssh
连接失败的同时输出以下错误:
channel 41: open failed: connect failed: open failed
channel 44: open failed: connect failed: open failed
channel 47: open failed: connect failed: open failed
channel 49: open failed: connect failed: open failed
channel 51: open failed: connect failed: open failed
channel 59: open failed: connect failed: open failed
channel 62: open failed: connect failed: open failed
channel 64: open failed: connect failed: open failed
负载测试参数是运行 100 个并发连接(连接、发送一些数据、接收一些数据、断开连接,总共要执行 10,000 个连接。)
观察到的行为是,在测试开始时非常快速地创建第一组连接时,很少有连接因上述错误而失败。多少次失败的范围从运行到运行,但通常在几到十几个之间。大多数失败往往发生在测试开始时,尽管有时会发生在测试的后期(即在完成前 100 次之后)。
SO 上具有类似描述的其他帖子似乎涵盖了 using localhost
with workaround to use的问题127.0.0.1
,这使得它不相关,因为它不是 TCP/IP 套接字。此外,destination
上述命令中的部分已指定为 IP 地址。
对如何解决和跟踪问题有点茫然。我尝试使用-vvv
来获取详细的ssh
操作转储,但没有任何成果(它为相关通道记录的所有内容是套接字设置为非阻塞)。
请注意,调用ssh
是从脚本完成的,并且调用之前ulimit -n 1024
应该提供足够多的文件描述符来为所有套接字提供服务。
此错误消息意味着远程 SSH 服务器无法执行 TCP 转发请求,因为它无法连接到隧道的目标。消息的最后一个“打开失败”部分是来自远程 SSH 服务器的错误消息。
当您使用端口转发运行 SSH 时,端口转发的工作方式如下:
在您的情况下,ssh 服务器在第 3 步失败,因为它由于某种原因无法连接到隧道的目标。
您应该检查远程服务器上的 ssh 日志。SSH 服务器进程可能已经记录了一条消息,说明它失败的原因。除此之外,您说这是在负载测试期间间歇性发生的,因此我将查看与负载相关的服务器端问题。我想到了几种可能性: