한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L7 ОС сервера (ядро)

Лимит файловых дескрипторов File descriptor limit (ulimit)

ID причины so-fd · Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Каждому соединению нужен файловый дескриптор (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.

Источники

  1. systemd-system.conf(5) — Linux manual page systemd
    DefaultLimitNOFILE для сервисов по умолчанию 1024:524288 (мягкий лимит 1 024)
  2. accept(2) — Linux manual page Linux man-pages
    При достижении лимита fd процесса accept завершается с ошибкой EMFILE
  3. Maximum Number of Sockets Supported Microsoft
    Winsock в Windows ограничивает число сокетов только доступной памятью
  4. pidstat(1) — Linux manual page sysstat
    fd-nr в выводе -v: число файловых дескрипторов, открытых процессом
  5. proc_pid_limits(5) — Linux manual page Linux man-pages
    В /proc/PID/limits указаны мягкие и жёсткие значения лимитов ресурсов процесса

Смотрите также

Тот же слой: L7 ОС сервера (ядро)

Причины с тем же симптомом (Ошибка входа / бесконечная загрузка) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами