Каждому соединению нужен файловый дескриптор (fd, номер, который ОС присваивает открытому файлу или сокету), а число fd, которые может открыть один процесс, ограничено.
Почему Онлайн достигает лимита файловых дескрипторов процесса → Следствие Сервер не может принять новые соединения (Too many open files). Заодно не открываются файлы логов и соединения с БД → На экране Начиная с определённого числа игроков больше никто не может войти: ошибка входа / бесконечная загрузка
Сразу после входа или техработ, При наплыве игроков
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Надёжно закрывать сокет при завершении соединения (чтобы не было утечки fd). Если accept завершается с EMFILE (не хватает fd), ненадолго перестать принимать подключения или принять подключение на заранее отложенный резервный fd и сразу закрыть (чтобы не тратить CPU на повторную обработку одного и того же уведомления о подключении).
Команда инфраструктуры: задачи
Проверить ulimit и настройки сервиса (LimitNOFILE в systemd), настроить алерт при приближении к лимиту.
Цифры для ориентира
В Linux, если отдельно не настроить сервис, лимит всё ещё часто равен 1 024. Для игровых серверов его обычно поднимают до десятков или сотен тысяч. В Windows такого низкого лимита по умолчанию нет.
На графике
Упор в лимит (плато) · число открытых fd процесса, онлайн
Где смотреть
Посмотреть fd-nr (число открытых файловых дескрипторов) процесса игрового сервера через pidstat -v и лимит открытых файлов в /proc/PID/limits, найти в логах сервера ошибки accept (EMFILE, Too many open files)
Подтверждает
Число fd выходит на плато на значении лимита, и с этого момента accept завершается с EMFILE
Опровергает
Если число fd далеко от лимита, причина в другом. Если запросы на подключение отбрасывает ядро, это «Переполнение очереди подключений (backlog)», если дело в отслеживании соединений, это «Переполнение таблицы conntrack на сервере»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Непринятые подключения так и остаются в очереди подключений ядра (backlog), поэтому, в зависимости от кода, сервер может раз за разом получать уведомление «есть новое подключение» и впустую тратить CPU.