我正在尝试跨外部节点网络运行代码。我可以通过 访问“主”节点ssh
,并且可以执行一个parallel
脚本,将作业划分到 5 个可用节点的集群上。我有一个bash
脚本,其中包含该parallel
命令以及其他必要的组件。
我使用的最终命令看起来与此类似。
parallel -S node0,node1,node2,node3,node4 --ssh-delay 0.25 --delay 0.5 'run {1} {2}' ::: foo ::: bar
然而,我正在处理的集群因挂起相对频繁而闻名,例如,在大约 5 分钟的空闲时间后,我收到错误Broken pipe
,并且ssh
连接断开。这就是为什么我使用 执行上面的 bash 脚本(包含上面的parallel
行)nohup
,这应该保持 ssh 连接处于活动状态。
但由于我的实际代码需要相当多的计算时间,因此我收到与损坏的 ssh 连接相关的错误:
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory^M
Permission denied, please try again.
即使从(例如node0
到node1
)连接,boss 节点到其他节点也不需要密码。这会导致parallel
抱怨没有更多可用的职位空缺,并发出无法登录的警告:
parallel: Warning: There are no job slots available. Increase --jobs.
parallel: Warning: Using only -1 connections to avoid race conditions.
parallel: Warning: ssh to node0 only allows for 0 simultaneous logins.
parallel: Warning: You may raise this by changing /etc/ssh/sshd_config: MaxStartups and MaxSessions on node0.
parallel: Warning: You can also try --sshdelay 0.1
我相信有一些挑剔的事情发生,过早地关闭了与集群内其他节点的 ssh 连接,可能是关闭与 boss 节点的连接的结果node0
。
我尝试使用ssh-agent
、ssh-copy-id
、 和sshpass
按照 GNU 并行教程建立连接,并在 中设置MaxStartups
和MaxSessions
参数/etc/ssh/sshd_config
,但无济于事。更重要的是,如果我减少代码的计算时间,那么并行命令将完美执行并按预期工作。
当执行的程序需要相当长的时间时,我可以做些什么来确保 ssh 连接不会中断,parallel
或者还有其他事情发生吗?
答案1
为了保持连接有效,您可以经常使用ServerAliveInterval
.可以在 中设置.ssh/config
。
答案2
我找到了错误的根源,即用于访问不同节点的 ssh-key 不正确。因此,问题既不在于 GNU 并行,也不在于 nohup。
让我首先更详细地说明设置,以理解问题。我首先从我的local
计算机连接到一个“老板”节点,boss
该节点连接到多个从节点slaves
。通过在ssh
连接到节点时启用 ssh 转发,进一步的 ssh 连接错误地使用了我计算机boss
上的密钥。因此,当我断开和 之间local
的连接时,无法访问正确的 ssh 密钥来建立与节点的连接。local
boss
boss
slaves
通过使用生成新的公共 ssh 密钥ssh-keygen
并将其添加到~/.ssh/authorized_keys
.结果是,当 和 之间的连接local
断开boss
时,仍然可以使用自己的公钥boss
与 建立 ssh 连接。slaves
由于 GNU 并行使用 ssh 建立连接,一旦密钥设置正确,权限(和其他相关)问题就消失了。nohup
与设置一起使用ServerAliveInterval 60
可解决/etc/ssh/ssh_config
所有断开连接问题,并允许boss
在进程保持运行时与节点断开连接。