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

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

Лавина аллокаций Allocation storms

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

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

Если во время события создаётся масса временных объектов, GC запускается намного чаще обычного.

Почему Дроп предметов, боевые логи и награды события резко увеличивают число временных объектов → Следствие GC запускается в несколько раз чаще, объекты, которые не успели стать мусором, переходят в область Old, и Full GC тоже наступает раньше → На экране Короткие периодические подвисания только во время событий

Симптомы
Микрофризы, Фриз
Факторы
Остановка
У кого
Весь сервер, Одна локация или канал
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Завести пулы объектов и переиспользуемые буферы, профилировать аллокации.
На графике
Растёт вслед за онлайном и нагрузкой · число сборок GC, скорость аллокаций
Где смотреть
Считать число сборок GC в минуту по GC-логу (Java -Xlog:gc, Go GODEBUG=gctrace=1), для .NET смотреть объём аллокаций и число сборок в dotnet-counters (с .NET 9 dotnet.gc.heap.total_allocated и dotnet.gc.collections, в 8 и ниже Allocation Rate и Gen 0 GC Count). Накладывать на онлайн и время событий
Подтверждает
С началом события скорость аллокаций и число сборок растут быстрее онлайна, короткие паузы учащаются. После события всё возвращается к прежнему уровню
Опровергает
Если число сборок прежнее, а каждая пауза стала длиннее, вырос объём живых данных (mem-gc-thrash, mem-leak)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. Garbage Collector Implementation Oracle
    Когда заполняется область Young, выполняется minor GC, часть выживших объектов переносится в область Old, а когда заполняется Old, собирается вся куча (намного дольше, чем minor). -Xlog:gc пишет по строке на каждый GC
  2. A Guide to the Go Garbage Collector Go
    Чем выше скорость аллокаций, тем чаще циклы GC. GODEBUG=gctrace=1 выводит трассировку GC
  3. dotnet-counters diagnostic tool .NET
    В .NET 9 и новее это dotnet.gc.heap.total_allocated и dotnet.gc.collections, в .NET 8 и ниже Allocation Rate и Gen 0 GC Count

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

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

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

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