Если на сервере, пусть даже написанном на C++, квесты, AI и умения выполняются скриптами (например, на Lua), то на время работы GC скриптового движка эта зона останавливается.
Почему В каждой зоне скриптовый движок выполняет квесты, AI и события и создаёт массу временных объектов → Следствие Когда GC скриптового движка собирает много за один раз, тик этой зоны останавливается → На экране Короткие периодические подвисания только в определённой зоне или во время определённого события
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Включить инкрементальный или поколенческий режим GC, выполнять сборку понемногу каждый тик, сократить временные объекты в скриптах.
Цифры для ориентира
Когда куча скриптов вырастает до сотен MB, сборка за один проход (с выключенной инкрементальной сборкой или полная сборка в поколенческом режиме) может занимать от десятков до сотен ms.
На графике
Всплески с постоянным периодом · время тика по зонам, память скриптового движка
Где смотреть
Каждый тик записывать время тика по зонам и потребление памяти скриптовым движком этой зоны (в Lua collectgarbage("count")) и накладывать их на один график
Подтверждает
Резкие падения памяти скриптов (сборка за один проход) совпадают со всплесками тика в этой зоне, остальные зоны в порядке
Опровергает
Если тик скачет без изменений памяти скриптов, дело в нагрузке этой зоны или в блокировках. Если скачут сразу все зоны сервера, это GC сервера (mem-gc) или своп (mem-swap)
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Источники
Lua 5.4 Reference ManualLua.org Инкрементальный режим разбивает сборку на мелкие шаги и вставляет их между участками выполнения программы (если шаг сделать большим, получится полная остановка), major-сборка в поколенческом режиме обходит все объекты с полной остановкой, collectgarbage("count") возвращает общий объём памяти, занятой Lua (в KB)