Назад | Перейти на главную страницу

Как systemd помещает процессы sshd в сегменты?

Я диагностирую бастион SSH, которым управляю. Эта машина имеет около 5500 SSH-соединений с переадресацией портов в любой момент времени.

Недавно я столкнулся с проблемой, из-за которой в SSH-соединениях было отказано, потому что пользовательский фрагмент, содержащий все эти процессы sshd, достиг предела MaxTasks.

Это было в новинку для меня, и во время диагностики я заметил, что user.slice не содержит все процессы sshd, как я думал. Примерно половина из них (не точная) принадлежит system.slice. Сначала я подумал, что это могли быть корневые процессы, а процессы, специфичные для пользователя (разделение привилегий), принадлежали user.slice. Однако, это не так. Кажется, это случайно.

Я заметил, что процессы, выполняемые user.slice, хорошо разделены на сеанс, тогда как те, которые хранятся в system.slice, просто хранятся в ssh.service без дальнейшего разделения.

# systemd-cgls
[...]
│ ├─user-1031.slice
│ │ ├─session-719.scope
│ │ │ ├─5559 sshd: <user> [priv]
│ │ │ └─6224 sshd: <user>
│ │ ├─session-617.scope
│ │ │ ├─4963 sshd: <user> [priv]
│ │ │ └─5392 sshd: <user>
│ │ ├─session-515.scope
│ │ │ ├─3862 sshd: <user> [priv]
│ │ │ └─4693 sshd: <user>
│ │ ├─session-413.scope
│ │ │ ├─3049 sshd: <user> [priv]
│ │ │ └─3988 sshd: <user>
[...]
└─system.slice
  ├─ssh.service
  │ ├─  338 sshd: <user> [priv]
  │ ├─  352 sshd: <user>
  │ ├─  353 sshd: <user>
  │ ├─  358 sshd: <user>
  │ ├─  385 sshd: <user> [priv]
  │ ├─  391 sshd: <user>
  │ ├─  392 sshd: <user>
[...]

Разделение привилегий OpenSSH реализуется с привилегированный и непривилегированный процесс для каждого соединения.

Нарезка по пользователю - это функция systemd-logind.service, управляемая pam_systemd. Мне непонятно, почему у вас все еще есть куча в systemd.slice. Возможно, они по-другому используют стек PAM.

Однопользовательский слайс для 5500 SSH-подключений? Более чем типично для одного пользователя, но вы можете это сделать.

Я предлагаю установить pids.max очень высоко, но не бесконечно, на пользовательских срезах. Более чем вдвое больше ожидаемого количества подключений. Для этого создайте /etc/systemd/logind.conf.d/local.conf и настроить:

[Login]
UserTasksMax=16000

Если у ssh.service более пары тысяч задач, также подумайте об увеличении его ограничений. На этот раз, используя общие директивы управления ресурсами, поэтому снижение настройки происходит на /etc/systemd/system/ssh.service.d/local.conf

[Service] 
TasksMax=16000