更新

更新

在我的应用程序中,我有两个服务器(私有和外部),并且需要私有服务器在外部服务器上运行脚本。

使用 ssh,我试图测试它可以容纳的连接数的限制:

while (1)
  foreach k (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 )
    ssh -i /path/to/key user@host "ls;sleep 0.3" &
    sleep 0.06  # <=16.6 times/sec
  end
end

外部服务器(2 核 CPU,4 GB 内存)在连接速率约为每秒 16 个时设法维持传入连接。如果连接速度超过该速率,则会出现连接问题,并且 CPU 负载会达到最高(总任务和僵尸进程数量开始累积。但是内存使用率似乎较低)。

我们在私服高频连接几秒钟后看到的错误信息是

 ssh_exchange_identification: Connection closed by remote host

在外部服务器上运行相同的测试脚本,我们没有看到该速率的问题(CPU 负载约为 7%,没有僵尸)。

假设这是一个 ssh 问题,所以我们在 ssh 配置文件中添加了这些并重新启动了 ssh 服务,但没有帮助:

MaxStartups 20:50:100
MaxSessions 100

更新

根据建议,我尝试使用 ControlMaster。以下是我所做的:

将其添加到私人服务器中的〜/ .ssh / config:

Host <external_host_ip>
       ControlMaster auto
       ControlPath ~/.ssh/cm_socket/%r@%h:%p
       ControlPersist 600

创建第一个连接:

 ssh -M -S /home/user/.ssh/cm_socket/user@host_ip:22 -i ~/key.pem  user@host_ip

我检查了一下,发现“cm_socket”文件夹中发生了一些事情:

$ ll ~/.ssh/cm_socket/
srw------- 1 user user    0 Oct 18 18:10 user@host_ip:22=

但是当我尝试在没有密钥的情况下进行后续 ssh 时,它不起作用:

$ ssh -M -S /home/user/.ssh/cm_socket/user@host_ip:22 user@host_ip
Permission denied (publickey).

有没有办法可以增加此设置可以处理的吞吐量?

答案1

使用ControlMaster

Host <external_host_ip>
   ControlMaster auto
   ControlPath ~/.ssh/cm_socket/%r@%h:%p
   ControlPersist 600
   User user
   IdentityFile ~/key.pem

然后使用 进行连接ssh host_ip。第一个会话启动连接,其他会话(根据您的设置最多可连续 100 个)将重用第一个会话。它应该会快得多。

相关内容