Заметки про игры

Истории из командного центра Pax Dei: День релиза

Команда Pax Dei поделилась закулисными подробностями первого дня выхода игры в Ранний доступ. После первоначального спокойного старта начали появляться проблемы с большим количеством NPC и задержками. Разработчики перезапускали серверы и быстро внедряли исправления. Также возникли трудности с открытием рецептов и размещением участков, но команда активно работала над их решением. К концу дня ситуация стабилизировалась, и игра вернулась к нормальному состоянию.

Для нас день релиза начался относительно спокойно. Все серверы во всех трех географических зонах были запущены, подготовлены и ожидали наплыва игроков. В полдень по UTC начали заходить первые игроки, и все системы справлялись хорошо, без критических автоматических предупреждений в наших системах мониторинга.

И снова кролики

Через час мы начали замечать, что серверы в некоторых более населенных зонах начали увеличивать количество NPC, что сказывалось на производительности. В то же время начались сообщения в Discord о сильных задержках перемещения (rubberbanding) в некоторых зонах, что было ожидаемым следствием.

Те, кто знаком с нашей историей со второй альфы, могут вспомнить, что неконтролируемая популяция кроликов однажды привела нас к коллапсу. В данном случае это были не конкретно кролики, а общее увеличение количества мобов, вызванное плотной и очень активной популяцией игроков, с которой наша система контроля не справлялась.

Временным решением стало выборочное перезапускание серверов, находившихся на грани, что означало кратковременное отключение для игроков, подключенных к этим зонам. Но, по крайней мере, сервер временно возвращался к нормальному состоянию.

К счастью, мы работали над исправлением этой проблемы в предыдущие дни, хотя не смогли полностью воспроизвести ее в лабораторных условиях. Мы решили ускорить внедрение исправления, которое затрагивало только серверы и не требовало патча от клиента. Построение и развертывание исправления на наши тестовые серверы заняло примерно 2 часа. Затем мы решили развернуть его выборочно на несколько худших зон, чтобы убедиться в его эффективности, прежде чем внедрять его повсеместно.

Развертывание исправлений на всех серверах всегда рискованно, поэтому мы предпочли применить его к подмножеству серверов для безопасности. Кроме того, после развертывания исправления в зоне, необходимо было подождать как минимум час, чтобы убедиться в его эффективности. До этого момента мы продолжали вручную перезапускать зоны в критическом состоянии, что было допустимым временным решением.

Задумавшиеся рецепты

Но при столь масштабном вторжении редко приходится сталкиваться только с одной проблемой. Из дискорда мы начали получать сообщения о проблемах с открытием рецептов, сопровождавшихся значительными задержками.

На наших серверах мы уже знали об одном слабом звене в этой системе: сервере Redis, который использовался для передачи уведомлений о рецептах всем игрокам (а также различных других уведомлений, таких как состояние здоровья членов группы и т. д.).

Этот сервер нельзя масштабировать просто добавлением нового оборудования, поэтому, если он достигал предела, нужно было решать проблему на более фундаментальном уровне.

Мы могли временно смягчить проблему перезапуском связанных сервисов, но немедленно начали работу над более постоянным исправлением, которое требует тщательного тестирования перед развертыванием, так что с этой нестабильностью придется мириться еще один день.

Невидимые постройки

Это отвлекло наше внимание, пока под поверхностью не зрела более серьезная проблема, частично скрытая в тумане войны. Примерно в 16:50 UTC начали поступать сообщения из дискорда, что у людей возникли проблемы с размещением участков, и некоторые не видели построенное, хотя ресурсы тратились. Первоначально это происходило в регионе США, но затем распространилось на регион ЕС, оставив регион ЮВА нетронутым.

Эта битва заняла у нас больше всего времени и оказалась самой сложной для устранения. Исправление не удалось найти до 02:00 UTC (День релиза + 1).

Виновником оказался связующий звено между нашей базой данных и сервисом, отвечающим за репликацию строительных элементов для всех игроков. Этот сервис имел предварительно настроенные квоты, которые были превышены, что привело к ограничению работы сервиса.

Обычно это не проблема, так как мы можем динамически увеличивать квоты, но в этом случае, когда квота была увеличена и база данных возобновила связь с сервисом, ей пришлось восстановить очень большой объем накопившихся транзакций. Хотя она выполняла это добросовестно, просто не успевала, что приводило к длительным задержкам между созданием строительных блоков и их репликацией для клиентов.

В какой-то момент задержка достигла целого часа. Для игроков это выглядело так, будто они не могут построить участок, но на самом деле они не видели завершения операции более часа. Это стало очевидным только с течением времени, но нам потребовалось некоторое время, чтобы выяснить причину. В режиме расследования мы решили позволить сервису работать в его темпе, чтобы не потерять состояние игроков, что заняло несколько часов.

После выявления причины мы применили несколько простых исправлений в конфигурации и перезапустили связанные сервисы. Состояние строительства было почти мгновенно восстановлено, и все регионы вернулись в нормальное состояние.

В это время мы почти забыли о нашей первоначальной тревоге: производительности серверов зон из-за популяции мобов, но были рады наблюдать, что после применения исправления к выбранным зонам, они оказались под контролем и работали значительно лучше, что было отличной новостью. Поэтому параллельно со всем вышеуказанным мы начали обновление всех серверов зон по всем регионам, что привело к кратковременному отключению игроков, но обеспечило более здоровый профиль ЦП для всех миров.

Итак, в 03:00 UTC (День релиза + 1), после почти 24-часовой смены, все в Командном центре чувствовали усталость, но были довольны. Мы все еще слышали отдаленные раскаты, и знали, что битва не окончена, но, по крайней мере, мы установили плацдарм и были готовы двигаться дальше.

Дальше