Неосвобождённая память понемногу накапливается, и через несколько дней это заканчивается трешингом GC, свопом или принудительным завершением процесса.
Почему Данные персонажей, вышедших из игры, и обработчики событий не освобождаются → Следствие Свободной памяти становится всё меньше в течение нескольких дней → На экране Сразу после техработ всё в порядке, с каждым днём лагает сильнее, в итоге сервер падает
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура
Команда разработки: задачи
Анализировать дампы кучи, проводить длительные нагрузочные тесты.
Команда инфраструктуры: задачи
Отслеживать тренд потребления памяти по процессам, настроить алерты.
На графике
Плавный рост · память процесса (RSS), куча сразу после GC
Где смотреть
Смотреть память процесса игрового сервера (RSS в pidstat -r) на отрезке в несколько дней, а для сервера с GC смотреть, сколько кучи остаётся сразу после GC. В Java это значение после GC (строки -Xlog:gc показывают занятый объём до и после GC), в .NET размер кучи после GC в dotnet-counters (с .NET 9 dotnet.gc.last_collection.heap.size, в 8 и ниже GC Heap Size)
Подтверждает
Объём кучи сразу после GC (нижняя линия) после перезапуска растёт день ото дня и не опускается даже ночью при низком онлайне
Опровергает
Если нижняя линия кучи ровная, а растёт только RSS, дело во фрагментации (mem-fragment) или в нативной памяти. Если память растёт и падает вслед за онлайном, это нормальное потребление
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если сервер каждую неделю перезапускается на плановых техработах, утечка маскируется и долго остаётся незамеченной. Часто она внезапно проявляется, когда техработы один раз переносят или когда онлайн вырастает из-за события.
Источники
Troubleshoot Memory LeaksOracle Если программа работает всё медленнее, стоит подозревать утечку, в итоге память кончается и процесс аварийно завершается. Главный материал для анализа утечки: дамп кучи
Debug a memory leak in .NET.NET Даже при наличии GC постоянные ссылки на ненужные объекты дают утечку, падение производительности и OutOfMemoryException. Проверка тренда памяти и анализ дампов