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

Анатомия игровых лагов › L10 Память

Своп Swapping

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

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

Когда памяти не хватает и ОС выгружает её часть на диск, при каждом обращении к этой памяти приходится ждать диск, который медленнее больше чем в 1 000 раз.

Почему Занятая память превышает физическую RAM → Следствие ОС выгружает часть памяти на диск и читает её обратно, когда она нужна → На экране Время тика вырастает до сотен ms, у всех игроков сервера слоумо и фризы

Симптомы
Слоумо, Фриз
Факторы
Остановка
У кого
Весь сервер
Когда
Чем дольше без перезапуска, Вечерний пик
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Ограничить потребление памяти процессом (размер кучи и т. п.), проверять на утечки.
Команда инфраструктуры: задачи
Настроить игровые серверы так, чтобы они не использовали своп, реагировать по алертам на память. Без свопа процесс принудительно завершается (OOM) в тот же момент, когда памяти не хватает, поэтому RAM нужно брать с запасом сверх пикового потребления.
Цифры для ориентира
Чтение из RAM занимает около 100 ns, чтение выгруженной памяти обратно с SSD около 100 µs (в 1 000 раз дольше), с облачного диска по ту сторону сети около 1 ms (в 10 000 раз), с HDD 10 ms (в 100 000 раз).
На графике
Плавный рост · занятый своп, swap-in и swap-out
Где смотреть
Накладывать на время тика столбцы si и so в vmstat 1 (сколько в секунду прочитано из свопа и выгружено в него), some и full в /proc/pressure/memory (доля времени, проведённого в ожидании памяти) и majflt/s в pidstat -r для процесса игрового сервера (ошибки страниц, при которых пришлось читать с диска)
Подтверждает
В моменты лагов si больше 0, вместе растут majflt/s игрового сервера и значение full в memory
Опровергает
Если si и so равны 0 и PSI по памяти около 0, своп ни при чём. Если свопа нет, а majflt/s и PSI растут, память кончилась и ОС перечитывает страницы кода, поэтому сначала нужно добавить или освободить память
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Сервер с GC при сборке читает кучу по всему объёму, поэтому, даже если в своп ушла только часть кучи, один цикл GC может растянуться до нескольких секунд или даже десятков секунд. Без свопа стадии замедления нет и процесс сразу принудительно завершается (OOM), поэтому сначала нужно обеспечить запас памяти. Даже без свопа, когда память почти кончилась, ОС выгружает из памяти страницы кода исполняемых файлов и читает их заново, и перед принудительным завершением весь сервер может какое-то время сильно тормозить.

Источники

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    «Numbers Everyone Should Know»: обращение к основной памяти 100 ns, позиционирование головки диска 10 ms (данные 2009 года)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: относительная стоимость свопа и освобождения файловых страниц, своп дорог, потому что это случайный ввод-вывод
  3. Concepts overview Linux kernel
    Ядро освобождает страницы страничного кэша, у которых есть копия на диске, и страницы, которые можно выгрузить в своп, а если памяти всё равно не хватает, OOM killer завершает процесс
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    Задержка серверного NVMe SSD на уровне 99,99% (four-nines latency) 130 µs: основание для оценки, что одно чтение с SSD занимает около 100 µs
  5. Amazon EBS General Purpose SSD volumes AWS
    Задержка стандартного облачного диска (gp3): единицы ms
  6. vmstat(8) — Linux manual page procps-ng
    si: память, прочитанная из свопа за секунду, so: память, выгруженная в своп за секунду
  7. PSI - Pressure Stall Information Linux kernel
    some в /proc/pressure/memory (доля времени, когда стояла часть задач) и full (доля времени, когда стояли все задачи одновременно)
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s (число ошибок страниц, при которых страницу пришлось читать с диска)

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

Тот же слой: L10 Память

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

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