Я диагностирую бастион 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