SLURM交互式节点上的Emacs乱码屏幕

问题描述

当我远程登录SLURM交互式节点时,emacs有时会显示乱码。正如我在下面描述的那样,我认为问题在于SLURM交互式节点使查询/确认终端信号混乱,并且某些字符被丢弃而引起毛刺。

设置

  • 我实际与之交互的计算机:MacBook Air(10.13.2)
  • 终端:iTerm2内部版本3.1.7
  • ssh进行群集
  • SLURM交互式节点(即srun --nodes=1 ... --pty /bin/bash
  • emacs:在终端模式(即emacs -nw)中使用的GNU Emacs 27.1

有时重新绘制屏幕时,屏幕会出现乱码:

Garbled emacs screen

当有许多窗格或四处移动文本时,似乎发生的更多。 基于emacs documentation的这一部分,我尝试使用C-l (recenter-top-bottom)重新绘制屏幕,​​并暂时解决了当前的故障。

通过在$TERM=screen中设置$TERM=xterm-256color.bash-profile,我看到了不同的配色方案,但故障仍然存在。

请注意,当我登录到交互式节点时才看到故障,而不是从群集的头节点看到故障。使用在日志记录节点上可以的事实,这可以提供有用的诊断信息。这使我怀疑问题是ENQ / ACK或填充定时,以便从群集发送的字符被丢弃。 tack terminfo诊断程序的documentation中对此进行了讨论。

登录节点交互式节点中同时使用tack给出相同的值

$ tack
Using terminfo from: /home/maom/opt/miniconda3/share/terminfo/x/xterm-256color

Name: xterm-256color|xterm with 256 colors
\r ^M (cr)    = ^M
\n ^J (ind)   = ^J
\b ^H (cub1)  = ^H
\t ^I (ht)    = ^I
      (clear) = ^[[H^[[2J
      (home)  = ^[[H
ENQ   (u9)    = ^[[c
ACK   (u8)    = ^[[?1;2c

Terminal size: 204 x 52.  Baud rate: 38400.  Frame size: 10.0

登录节点上使用Baudrate test

1600949 characters per second.  Baudrate 52  Done

交互式节点上使用Baudrate test,每秒的字符速度要慢30%:

1090426 characters per second.  Baudrate 52  Done

然后,使用登录节点上的test ENQ/ACK handshake给出:

Testing ENQ/ACK,standby...
This program expects the ENQ sequence to be answered with the ACK character.  This will help the program reestablish synchronization when the terminal is overrun with data.

ENQ sequence from (u9): ^[[c
ACK received: ^[[?1;2c
Length of ACK 7.  Expected length of ACK 7.
Terminating character found in (u8): c

交互式节点节点上使用test ENQ/ACK handshake时,会给出:

Testing ENQ/ACK,standby...

ACK terminating character: c

是否可以通过集群管理员支持更新terminfo来修复故障,以解决此问题?

解决方法

我遇到了同样的问题,我不知道最佳解决方案,但这可能会有所帮助。首先,当您执行 srun 时,最好在 bash 上传递 -li

srun --nodes=1 ... --pty /bin/bash -li

这将确保它加载您通常在正常登录时打开的交互式 bash 配置文件。

这并不能完全解决我的问题,但是如果我在交互式会话中执行 tmux 然后运行 ​​emacs,那么我就没有乱码问题。