Fortnite

Временный режим «Песочница» — работа над ошибками

18.07.2018
Кто: Команда разработчиков Fortnite
Всем привет!

27 июня, примерно в 11 утра по московскому времени, мы запустили временный режим «Песочница». Вскоре после этого на сервере, отвечающем за подбор игроков, возникла перегрузка, из-за которой стали недоступны и обычные режимы, и «Песочница». Мы сразу занялись исправлением неполадок и вечером 2 июля всё-таки смогли запустить новый режим.

Что произошло?
Наш сервер использует так называемую «Службу подбора игроков» (СПИ), которая помогает игрокам, которые хотят присоединиться к матчу, подключиться к свободным выделенным серверам, готовым принять этот матч. В каждом модуле кластера, отвечающего за подбор игроков, хранится длинный список свободных выделенных серверов, с которыми он может работать. Эти серверы случайным образом распределены по регионам, чтобы в каждом было примерно одинаковое количество доступных мощностей. Подключаясь к СПИ, игрок запрашивает сервер для своего региона, СПИ выделяет ему один из модулей, а модуль находит в своём списке свободный сервер для указанного региона.

Поскольку в режиме «Песочница» сервер нужно создавать для групп по 1–4 человека, а не 100 сразу, система выполняет в 25, а порой и в 100 раз больше операций, чем обычно, в зависимости от размера группы. Мы можем поместить чуть больше виртуальных серверов в каждый физический центральный процессор для режима «Песочница», но даже при этом нам придётся использовать в 15 раз больше серверов, чем для остальных режимов. Мы смогли обеспечить необходимое количество серверов, но тут обнаружилось, что каждый модуль теперь работает со списком, который в 15 раз длиннее прежнего.

Когда модуль СПИ не может найти в своём списке свободный сервер для заданного региона, он обращается к соседним модулям с просьбой выделить ему запасной и начинает просматривать их локальные списки. Представьте себя на месте модуля. Ваш список внезапно стал в 15 раз длиннее, и это вас сильно замедлило. А теперь вы должны прочитать все остальные списки, каждый из которых в 15 раз больше прежнего. Ваша производительность падает в 15 раз для каждого модуля, и время, необходимое для выполнения операций, возрастает в геометрической прогрессии. Когда мы запустили «Песочницу», наплыв игроков оказался настолько мощным, что локальные списки модулей СПИ пустели быстрее, чем система успевала их обновлять. Каждый модуль начал обращаться ко всем остальным модулям с просьбой выделить серверы, но их тоже не было, либо ему приходилось очень долго ждать, пока в соседнем списке появится сервер. На операции уходило так много времени, что у ЦП возникла длинная очередь невыполненных запросов, которая вызвала появление петли обратной связи, и система в конечном итоге зависла.

Как мы исправили ситуацию?
Первое, что мы сделали, отключив режим, — выделили СПИ для «Песочницы» в отдельный служебный кластер. Благодаря этому исчезла задержка, мешавшая основным режимам, а мы смогли доработать службу, постепенно внося в неё правки по мере необходимости, пока готовились к повторному запуску «Песочницы». Мы несколько раз вносили всё более кардинальные изменения в структуру службы и проводили испытания до тех пор, пока не достигли результата, с которым уже можно было вновь запустить режим.

Установив, что проблема возникла из-за локальных списков сеансов, мы решили, что позволим кластеру массово перераспределять сеансы других модулей, чтобы устранить необходимость в частых повторных запросах. Теперь система постоянно перераспределяет региональные мощности, забирая излишки у одних модулей и передавая их тем, где они на исходе. Благодаря этому вероятность того, что модуль какого-нибудь региона останется с пустым локальным списком и будет вынужден обратиться к соседним, резко снизилась. Эта проблема сейчас не ощущается в основных режимах «Королевской битвы», но мы намерены модернизировать таким образом и основной кластер СПИ, чтобы застраховать систему от проблем в будущем.

Меняя структуру СПИ, мы проводили нагрузочные испытания с максимальными параметрами, чтобы сымитировать ситуации, выходящие далеко за рамки обычного использования системы и штатных методов тестирования. Мы создавали миллионы теоретических пользователей и «скармливали» их СПИ-системе «Песочницы», порождая гигантские волны в попытке обрушить наш новый распределитель сеансов. Мы тратили по несколько часов на каждый цикл «изменение — тестирование — анализ» и постепенно смогли добиться такого поведения распределителя, чтобы он мог справляться с нагрузкой. Попутно мы нашли и устранили несколько редких ошибок, угрожавших сорвать повторный запуск «Песочницы».

Какие выводы мы сделали?
Если вкратце, мы узнали очень многое о работе нашей службы подбора игроков и выявили её уязвимые места. Мы готовились к постоянной максимальной нагрузке на службу подбора игроков, взяв за основу текущее количество игроков (и добавив щедрый запас для прочности), но не учли массовый наплыв при запуске режима, опустошивший локальные списки.

Перезапуская режим, мы извлекли и другой ценный опыт. Мы решили, что будем перезапускать «Песочницу» постепенно, добавляя отдельные платформы и регионы, чтобы снизить первоначальную нагрузку на систему и наращивать её постепенно. Но результат оказался прямо противоположным: игроки начали переключаться на регионы, где режим уже стал вновь доступен, и заставили нас замедлить запуск, поскольку нам пришлось подключать дополнительные мощности. Зато мы теперь прекрасно знаем, какие облачные мощности доступны нам в Азии, и благодарим наших партнёров, которые их обеспечивают, за быструю помощь в решении проблемы!

Запуск и стабилизация режима «Песочница» оказались гораздо сложнее, чем мы бы того хотели, но эта ситуация вновь напомнила нам о том, что сложные распределённые системы выходят из строя по самым непредсказуемым причинам. Нам пришлось экстренно вносить серьёзные коррективы в работу службы подбора игроков, но эти изменения помогут расти и развиваться игре и сообществу её поклонников.