Вопрос или проблема
У меня есть сервер на Vultr (vCPU), который работает на Ubuntu 16 (обновление пока невозможно). Каждый раз, когда я подключен к серверу по SSH и использую alt+tab или сворачиваю окно, SSH-соединение зависает и появляется сообщение “запрос на отключение”.
TCPKeepAlive
установлен на “да”, и интервал уже достаточно длинный. Кажется, что если терминал не является активным окном, соединение разрывается. И это происходит только на этом сервере.
Поскольку в вашем вопросе об этом не упоминается, я предполагаю, что под “окном” вы имеете в виду окно терминала эмулятора, из которого вы подключаетесь к серверу по SSH? Я спрашиваю, потому что подозреваю, что оно приостанавливается, когда не в фокусе или свернуто. Я только читал об этом, когда такое было в некоторых старых версиях Windows (8?). Я сильно подозреваю, что современные композиторы Wayland делают что-то подобное, потому что в Sway, когда Firefox невидим (на другом рабочем столе), его загрузка процессора заметно снижается. Или вы фактически подключаетесь по SSH с машины на Windows? Потому что, очевидно, проблема кроется в клиенте SSH, а не на сервере. Если клиент зависает по какой-либо причине, это неизбежно приведет к потере пакетов из-за таймаутов.
Ответ или решение
Ваш вопрос касается проблемы с заморозкой и разрывом SSH подключения при минимизации окна терминала, и вы указали, что сервер работает на Ubuntu 16 с провайдером Vultr. Давайте подробно разберем возможные причины и решения этой проблемы, используя метод TEA (Теория, Пример, Применение).
Теория (Theory)
Когда вы подключаетесь к серверу по SSH, создается зашифрованный канал связи, позволяющий безопасно управлять сервером удаленно. Этот канал чувствителен к потерям и задержкам пакетов, потому что связь должна оставаться надежной и быстрой. Если на стороне клиента происходит какое-либо временное приостановление, сервер может воспринять это как потерю соединения.
Вы упомянули, что опция TCPKeepAlive=yes
уже установлена. Эта опция предназначена для поддержания активного соединения и предотвращения его разрыва в случае отсутствия трафика. Однако она не решает проблему, если клиентская сторона приостанавливает или ограничивает деятельность самого приложения, в данном случае — терминала.
Пример (Example)
В операционных системах, таких как Windows или некоторые Linux-менеджеры окон, может существовать механизм энергосбережения или оптимизации, который при минимизации окна ограничивает активность приложения, чтобы сохранить ресурсы. Это может привести к временной остановке (suspension) процесса терминала и, как следствие, к нарушению SSH соединения из-за тайм-аута ожидания данных.
Например, в Windows 8 было обнаружено, что минимизация окна могла приостанавливать активные процессы, что приводило к подобным проблемам. Подобные механизмы можно встретить и в современных wayland-композиторах, таких как Sway, где производительность невидимых окон снижается.
Применение (Application)
Теперь, чтобы решить вашу проблему, нужно предпринять следующие шаги:
-
Проверка настроек клиента SSH. Убедитесь, что настройки SSH клиента включают параметры для поддержания активного соединения. Помимо
TCPKeepAlive
, вы можете добавить в файл конфигурации клиента (обычно это~/.ssh/config
) параметрыServerAliveInterval
иServerAliveCountMax
. Например:Host * TCPKeepAlive yes ServerAliveInterval 60 ServerAliveCountMax 3
Параметр
ServerAliveInterval
заставляет клиент отправлять пакет "keep-alive" каждые 60 секунд, аServerAliveCountMax
указывает количество таких пакетов перед разрывом соединения в случае отсутствия ответа. -
Проверка настроек оконного менеджера. Если вы используете Linux и менеджер окон с композитором (например, Wayland или Sway), убедитесь, что он не оптимизирует скрытые окна до состояния, при котором приложение приостанавливается. Проверьте документацию или настройки для отключения такой функции.
-
Опережающие меры по диагностике. Запустите мониторинг сетевой активности между клиентом и сервером с помощью инструментов, таких как
tcpdump
илиWireshark
, чтобы выявить пониженную активность или отсутствующий трафик на период минимизации окна. -
Изменение клиента или метода подключения. Если после проверки предыдущих методов проблема остается, попробуйте использовать другой терминал или клиент. Например, если вы используете PuTTY на Windows, попробуйте MobaXterm или OpenSSH через WSL. На Linux вы можете попробовать более легкие эмуляторы терминала, такие как Alacritty.
-
Исключение концентрации ресурсов. Некоторые операционные системы или установленные программы могут ограничивать использование системных ресурсов невидимыми окнами путем приостановки процессов. Проверьте, не активированы ли такие настройки в вашей ОС, и внесите необходимые изменения.
Эти подходы помогут устранить проблему замораживания вашего SSH сеанса при минимизации окна терминала, предоставив больше уверенности и стабильности в работе с сервером.