SLURM集群中多次登录时保存的Tmux Session不见/消失/时隐时现/随机出现的问题

先说结论,不少Slurm集群使用了两到多个login node来缓解入口机器的压力,均衡负载。这些node每个实际上都可以被看做是一个独立的服务器,只是共享了文件系统和其他一些服务。而Tmux是依赖于node,即这里是login node的。如果换了node,自然也就找不到你之前detach后存档的tmux窗口了。

不幸的是,你能登录到哪个node不说是完全随机的,但是由系统根据负载动态分配的,所以说到底你并无法控制你ssh到cluster后被自动分配到了哪个主机。当然,你可以通过hostname -scat /etc/hostname来获知你当前的主机名,以判断你之前save的tmux session是不是在相同的node上。

至于解决方案,有三种:

  1. 如果你的SLURM集群支持集群内部node相互ssh,那问题就好办了,直接ssh过去就好了。例如,如果你已知自己的tmux session建立在login2 node上,而经过上一步的check hostname,你得知当前的主机名称是login1,那解决方案就简单直接了:ssh login2ssh -Y login2. 来源:Link

    注意:如果你登录server时候用的是pub和private key file认证,那么很有可能你无法直接在多个login node中跳转。若想做到这点,需要你将自己的private key上传到server,并使用ssh -i <your/id_rsa.pub> loginN 命令登录。

  2. 如果很遗憾,由于安全设定原因,你无法在cluster内从一个node ssh到另一个,那其实解决方案就比较脏了,建议多次登录,开多个tab登录,使用多个可能的机器登录,挑选被分配到login2 node的那个session使用吧。据我的经验来看,如果一个机器登不上login2,比起在同一个机器上继续尝试,使用另一台机器试试成功概率更大。当然这也许有点玄学成分了。

  3. 参考这篇文章,他们的大致做法是每次启动tmux时写一个文件保存当前login node,然后你本地登录的时候对此进行解析,如果不在一个node上就重新来。但看下来他们需要不同的login node有一个专属的名字,可以直接ssh到特定login node。Webpage Link,以及GitHub Link

小Tips:如果可能,把tmux放login1上,一般负载没那么高的时候经验来看更倾向于被分配到第一个login node。