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

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

Изменение производительности после обновления ОС, ядра, драйверов или прошивки Performance regression after OS / kernel / driver / firmware update

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

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

Игровой код не менялся, но после обновления ОС, ядра, драйверов или прошивки сервер стал работать медленнее. Обновление может поменять значения по умолчанию, планировщик, защиту от уязвимостей CPU (mitigations) и поведение драйверов.

Почему Регулярный патч безопасности или новый образ сервера меняет ядро, драйверы или прошивку → Следствие Меняются значения по умолчанию или планировщик, включается новая защита от уязвимостей: на ту же работу уходит больше процессорного времени, а потоки получают CPU в другом порядке → На экране Сервер, который работал нормально, со дня обновления постоянно чуть медленнее: задержка ввода, а при наплыве игроков микрофризы и слоумо

Симптомы
Задержка ввода, Микрофризы, Слоумо
Факторы
Задержка, Остановка, Джиттер
У кого
Весь сервер
Когда
Всегда, При наплыве игроков
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Сначала обновлять часть серверов, сравнивать время тика, задержку и загрузку CPU с прежней версией и только потом раскатывать дальше. Не выкатывать в один день с игровым патчем. Записывать версии ядра, драйверов и прошивки и ключевые значения sysctl до и после обновления. При проблемах загрузиться со старым ядром и проверить. Отключение защиты (mitigations=off) решать, взвесив риски безопасности.
Цифры для ориентира
С новой версией ядра меняется и поведение по умолчанию. Например, начиная с 6.6 Linux стал переходить с планировщика CFS на EEVDF, а значение предела очереди подключений (somaxconn) по умолчанию с версии 5.4 выросло со 128 до 4 096. Защита от уязвимостей CPU добавляет работу: при возврате из ядра в программу (после каждого системного вызова), при переключении контекста и переключении виртуальных машин очищаются внутренние буферы CPU и т. п. Поэтому сильнее страдают сетевые серверы, которые делают системный вызов на каждый пакет. Для полной защиты от некоторых уязвимостей нужно выключить SMT (технологию, при которой одно ядро работает как два потока), а без SMT производительность в зависимости от нагрузки может сильно упасть. Параметр ядра mitigations=off отключает всю эту защиту и возвращает производительность, но оставляет систему уязвимой.
На графике
Ступенька вверх с определённого момента · время тика сервера, загрузка CPU, задержка при той же нагрузке
Где смотреть
Сопоставить с моментом роста задержки историю обновлений в пакетном менеджере и время перезагрузки, версию ядра из uname -r и сведения о драйвере NIC из ethtool -i. Сравнить обновлённые и необновлённые серверы под одинаковой нагрузкой через mpstat и pidstat, а также состояние защиты в /sys/devices/system/cpu/vulnerabilities/
Подтверждает
Задержка и загрузка CPU ступенькой поднимаются с момента перезагрузки после обновления и так и остаются, причём под одинаковой нагрузкой они выше только у обновлённых серверов. После загрузки со старым ядром или драйвером всё возвращается
Опровергает
Если обновлённые и необновлённые серверы под одинаковой нагрузкой одинаково медленные, причина в другом. Если в тот же день выкатили и игровой патч, а число или размер пакетов на игрока изменились, это «Патч изменил характер трафика»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Состояние защиты смотрят в файлах в /sys/devices/system/cpu/vulnerabilities/. По умолчанию (mitigations=auto) защита работает с включённым SMT, а с auto,nosmt на уязвимых CPU SMT выключается, и после обновления ядра число логических ядер может сократиться вдвое. Если обновить ОС в один день с игровым патчем, будет трудно понять, что стало причиной, поэтому их выкатывают отдельно.

Источники

  1. The kernel’s command-line parameters Linux kernel
    mitigations=: off отключает всю защиту от уязвимостей CPU и повышает производительность, но оставляет систему уязвимой. По умолчанию auto защищает с включённым SMT, auto,nosmt при необходимости выключает SMT
  2. MDS - Microarchitectural Data Sampling Linux kernel
    Защита очищает буферы CPU при возврате из ядра в пространство пользователя и при входе в виртуальную машину. Состояние уязвимостей и защиты показывают файлы в /sys/devices/system/cpu/vulnerabilities/. На многих CPU для полной защиты нужно выключить SMT, а это в зависимости от нагрузки сильно бьёт по производительности
  3. Spectre Side Channels Linux kernel
    Для защиты буферы предсказания переходов очищаются при переключении контекста и переключении виртуальных машин, а строгие варианты защиты добавляют накладные расходы всем программам
  4. EEVDF Scheduler Linux kernel
    Начиная с 6.6 Linux переходит с CFS на планировщик EEVDF
  5. listen(2) — Linux manual page Linux man-pages
    Значение somaxconn по умолчанию с Linux 5.4 изменилось со 128 на 4 096
  6. ethtool(8) — Linux manual page ethtool
    ethtool -i показывает сведения о драйвере сетевого устройства

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

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

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

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