Как мы повысили производительность серверов VALORANT с момента выхода игры
Задолго до выхода VALORANT мы решили, что наши серверы должны обновлять игровые данные с частотой 128 Гц. Таким образом, тикрейт 128 стал доступен всем, а не только участникам турниров мирового класса. Если хотите узнать, как мы этого добились, прочтите нашу статью о серверах с тикрейтом 128 в VALORANT.
Держать производительность серверов на достойном уровне – это вечная борьба с обстоятельствами. В игре то и дело появляется что-нибудь новое, и чтобы сохранить заданный тикрейт, нужно постоянно следить за производительностью. Разные проблемы постепенно копятся, и некоторые из них приходится решать срочно.
В августе 2022 года мы столкнулись с самым значительным снижением производительности серверов с момента выхода VALORANT. Проблема затронула матчи, где участвуют более 10 игроков, например "Свою игру" и киберспортивные матчи. Чтобы справиться с этим, нам понадобилась целая армия разработчиков, продюсеров, руководителей и ребят из команды киберспорта, работавших в Стамбуле, где вот-вот должен был состояться крупнейший турнир года.
Пытаясь решить проблему, мы выяснили, что можно серьезно уменьшить время кадра и таким образом значительно увеличить производительность. Начиная с патча 5.07 тикрейт серверов в VALORANT наиболее стабилен с момента выхода игры в июне 2020 года.
Я Аарон Чини, разработчик из команды, отвечающей за быстродействие VALORANT. Вот о чем пойдет речь в этой статье:
- как наша команда отслеживает быстродействие игры;
- как мы обнаружили сильное снижение быстродействия незадолго до Champions 2022;
- как мы расставляем приоритеты, как решаем срочные проблемы и чему нас научил случай с Champions 2022.
Сначала я расскажу, как мы выявляем проблемы и определяем, насколько они серьезные.
Итак, как заметить снижение быстродействия?
Снижение быстродействия – неизбежная проблема при разработке игр. Игра – это большая и сложная система со множеством компонентов, каждый из которых влияет на быстродействие в целом. Со временем в играх появляется новый контент, и система становится еще сложнее. Поэтому так важно вовремя замечать проблемы и определять их первопричину.
Этими вопросами в VALORANT занимается наша команда. Наша задача – следить за взаимодействием серверной и клиентской части игры на разном оборудовании и сохранять быстродействие на нужном уровне. С помощью специальных методов и инструментов мы обнаруживаем проблемы на ранней стадии и решаем их еще до того, как игроки их заметят.
Целевая производительность серверов
Чтобы частота обновления данных была не менее 128 Гц, каждый кадр на сервере должен обрабатываться менее чем за 7,8125 миллисекунд (мс). Но если так сделать, то игра полностью загрузит ядра процессора. Поэтому для поддержания тикрейта 128 и адекватной ресурсоемкости игры наши серверы обрабатывают по 3 кадра примерно за 7,8 мс. Это значит, что время каждого кадра на сервере в среднем не должно превышать 2,6 мс. На самом деле мы придерживаемся целевого значения в 2,34 мс, и вот почему.
- Остается достаточный запас ресурсов, за счет которого можно обрабатывать более длинные кадры и при этом не опускать тикрейт ниже 128. Так наши серверы остаются надежными, к тому же нам нужно место для операционной системы, диспетчера задач и других программ на сервере.
- VALORANT будет окупаться. Серверная инфраструктура стоит дорого. Конечно, было бы круто, если бы каждый матч VALORANT проходил на отдельном сервере, но тогда на игру не хватит никаких денег.
Текущие измерения и прогнозы на будущее
Чтобы отслеживать падение производительности, наша команда использует два основных источника данных.
- Предрелизные данные. Их сбор происходит с внутренних игровых тестов, автоматического тестирования и ПТС.
- Игровые данные. Это информация от игроков, которая собирается с наших игровых серверов по всему миру.
Предрелизные данные позволяют анализировать еще не вышедший контент и делать прогнозы на будущее. Таких данных гораздо меньше, чем игровых, поэтому тенденции видны не столь явно, к тому же возникает много выбросов и отклонений. Делать четкие выводы по этой информации довольно сложно. Пограничные случаи тоже часто остаются незамеченными, потому что протестировать абсолютно все невозможно, как бы мы ни старались.
А вот игровые данные позволяют наблюдать за текущим состоянием VALORANT, точно измеряя данные на стороне игроков. Этих данных намного больше, чем внутренних (миллиарды записей!). Такой объем тяжело обработать, поэтому мы анализируем эти данные в обобщенном виде.
В общем, предрелизные данные позволяют заранее оценить контент до его выхода, а игровые данные – реагировать на уже возникшие обстоятельства. Используя эти два набора данных, можно выявить большинство проблем.
Типичный матч VALORANT
Подавляющее большинство игроков VALORANT предпочитает рейтинговую игру и режим без ранга. Матчи в обоих режимах проходят на одинаковых условиях с участием ровно 10 игроков. Разница лишь в том, что одни матчи влияют на ранг, а другие – нет. Конечно, в VALORANT можно играть по-разному – здесь есть "Репликация", "Быстрая установка Spike", "Бой насмерть" и не только, но за двумя популярнейшими режимами мы следим особенно тщательно.
Итак, в большинстве матчей VALORANT участвуют ровно 10 игроков, но бывают особые (и очень важные) случаи, когда их больше.
Нестандартные матчи VALORANT
Во время киберспортивной трансляции к матчу могут подключаться до 22 клиентов. Это особые игры с поддержкой режима просмотра. Чаще всего в таких матчах участвуют:
- 10 игроков (по 5 в каждой команде);
- 2 тренера (по 1 в каждой команде).
- Еще 10 зрительских мест занимают ведущие трансляций. Именно благодаря им болельщики могут смотреть матчи в прямом эфире, находясь где угодно.
Такие игры с 22 клиентами сильно отличаются от типичных матчей VALORANT. Сервер должен обеспечивать корректное отображение происходящего в игре для всех. На обычном сервере этого было бы трудно добиться, но при проведении киберспортивных матчей мы используем отдельное оборудование, чтобы игроки точно не столкнулись с проблемами.
Целевая производительность для нестандартных матчей VALORANT
Помните, мы рассказывали о целевой производительности серверов? Для типичного матча с 10 игроками время кадра не должно превышать 2,34 мс. Но когда к матчу подключается более 10 участников, этот показатель линейно растет пропорционально увеличению количества клиентов.
Например, с 22 клиентами среднее время кадра увеличивается примерно в 2,2 раза, то есть с 2,34 мс до 5,2 мс. Это все еще намного меньше 7,8 мс, необходимых для поддержания тикрейта 128.
Таким образом, с помощью данных, собранных в типичных матчах, можно точно предсказать производительность в нестандартных матчах, учитывая наш опыт с нестандартными играми VALORANT и понимание работы серверов.
А если что-то изменится? Как быть, если падение производительности сервера с ростом числа клиентов становится нелинейным?
Снижение производительности
Вернемся к августу 2022 года. Первые тревожные звонки появились во время игрового теста с 22 клиентами: участники заметили колебания тикрейта и столкнулись с неудобствами в процессе игры. Судя по видеозаписям матча, что-то действительно пошло не так. Нам очень повезло, что эту проблему удалось обнаружить заранее. Игровые тесты с 22 подключениями тогда еще не были стандартизированы, но к счастью, в самый разгар смен составов и подготовки к Champions 2022 один из внимательных разработчиков VALORANT запросил у наших партнеров по тестированию игровой тест на 22 клиента.
Ситуация еще не были критичной, но мы сразу начали оценивать масштаб проблемы и работать над ее решением.
Определение проблемы
Одна единица данных еще не указывает на тенденцию. Чтобы понять серьезность проблем, мы стали обрабатывать телеметрию с игровой среды, группируя матчи по числу клиентов от 10 до 22. Результат оказался поразительным.
Причина проблем была еще не ясна, но картина на графиках выглядела тревожно: производительность сервера падала с увеличением числа клиентов, да еще и нелинейно.
Таким образом, мы выявили серьезные неполадки незадолго до Champions 2022, который должен был состояться во время патча 5.04. Их нужно было устранить как можно скорее.
На этом графике показано изменение времени кадра на сервере с выходом новых патчей. Каждая линия соответствует количеству клиентов – от стандартных 10 до 22. Производительность ожидаемо падает с каждым дополнительным клиентом, но резкий рост на графике во время патча 5.03 означает, что она снижалась нелинейно.
Фрагментация проблемы
Этот процесс обычно подразумевает уменьшение негативных последствий, пока первопричина неполадок еще не определена. Подобный метод используется в медицине для оценки ситуации и немедленного реагирования, а в Riot он применяется для срочного исправления ошибок.
Чтобы справиться с падением производительности, мы одновременно сделали две вещи.
Разработали план экстренного реагирования
Во-первых, руководство VALORANT и наши стамбульские партнеры продумали план экстренного реагирования на случай, если исправить ситуацию до начала Champions 2022 не получится.
Поскольку мы поняли, что проблемы возрастают с увеличением числа подключенных клиентов, нам прежде всего нужно было определить минимальное количество подключений для беспроблемного просмотра киберспортивных матчей. 22 клиента было явно слишком много. Сколько же участников мы можем себе позволить в таких условиях? Вместе с нашими киберспортивными партнерами мы выяснили, что стабильный тикрейт 128 сохраняется при 15 игроках и 5 зрителях. Как видите, запас для времени кадра мы закладывали не зря.
Определили главную причину проблемы
Во-вторых, разработчики VALORANT продолжали изучать падение производительности, чтобы понять, почему оно происходит. Когда происходит такой серьезный сбой, вряд ли дело сразу в нескольких системах.
Мы надеялись, что нам повезет и мы успеем все найти и починить к старту Champions 2022, но, к сожалению, у нас не получилось.
Устранение проблемы
Мы обнаружили снижение производительности 25 августа 2022 года и справились с ним в течение недели. Все это время большая команда разработчиков тщательно исследовала состояние игры, чтобы найти возможные решения.
В первый день поисков мы обнаружили, какая часть кода отвечает за снижение – это была репликация. Речь идет не о режиме игры, а о процессе, с помощью которого Unreal синхронизирует параметры действующих акторов и компонентов и гарантирует соответствие между сервером и клиентами. Подробнее о системе репликации в Unreal можно прочесть здесь.
Приоритетной задачей было проанализировать период между патчами 5.02 и 5.03, чтобы найти, как именно могла измениться репликация. Это было нелегко, потому что тогда мы как раз перешли на Unreal Engine 4.26, а это означает изменение некоторых ключевых компонентов движка. (Если вам хочется подробнее узнать о том, как VALORANT обновляет Unreal Engine, прочтите этот тред главы технического отдела VALORANT Маркуса Рида в Twitter.)
Исследовать репликацию было непросто. Во-первых, она не требует особого внимания разработчиков VALORANT, так как ее функционал уже проверен многолетним опытом. Во-вторых, она создавалась не в Riot. Мы лишь модифицировали базовый движок под свои нужды, но весь продукт нам досконально не известен.
Затем мы стали изучать разные элементы игры, чтобы определить изменения между патчами 5.02 и 5.03 и сузить круг поиска причины падения производительности. С помощью инструментов профилирования от Unreal и Riot мы сравнили показатели производительности в этих двух патчах и наконец выяснили, что персонажи, оружие и умения гораздо чаще реплицировались в патче 5.03, чем в патче 5.02.
В это время мы были заняты двумя главными задачами.
- Найти истинную причину проблем и решить ее. Это идеальный вариант, к которому мы стремились.
- Найти другие способы повысить производительность. Если у нас получится снова добиться нужного времени кадра, то с производительностью будет все в порядке, даже если изначальную проблему исправить не удастся.
Несколько групп инженеров вовсю искали возможности для исправлений и улучшений, успев за это время неплохо разобраться в работе репликации. Мы нашли несколько способов улучшить производительность, но пока их было слишком рискованно внедрять, поэтому мы сохранили их на будущее.
1 сентября 2022 года корень зла был найден – из-за одной строки кода в обновлении UE 4.26 репликация в VALORANT срабатывала намного чаще, чем раньше. Именно поэтому по мере подключения к серверу новых клиентов производительность стала снижаться значительно сильнее. Если в матче было 10 участников, проблема была не особенно заметна, но с 22 клиентами играть было невозможно.
Все складывалось как нельзя лучше: проблема найдена, исправление не было рискованным, и мы были уверены в своих выводах. Открывать шампанское было пока рановато, но мы были очень рады, что код удалось изменить к лучшему.
//<RGI> Мы обрабатываем вызов ForcePropertyCompare(). Если добавить его здесь (за пределы bNewlyReplicatesBlock), // то число сравнений сильно возрастает, потому что из-за FScopedRoleDowngrades в UActorChannel::ReplicateActor() нам приходится постоянно //менять флаг bReplicates и заново инициировать сравнения. // 12 разработчиков VALORANT поработали на славу. // ForcePropertyCompare(); // </RGI>
Что было потом
Когда причина проблем была обнаружена и устранена, мы провели большое тестирование. Нужно было убедиться, что производительность снова в порядке и что изменение не вызвало новых ошибок.
Внедрение исправлений
Решение было найдено 1 сентября 2022 года, но мы добавили его в киберспортивную игровую среду только 8 сентября, поле группового этапа турнира. Сначала надо было все проверить, чтобы исключить риски для участников стамбульских матчей.
На игровых серверах VALORANT исправление появилось с патчем 5.05 и значительно улучшило игру.
После Champions 2022
Но на этом веселье не закончилось. За неделю изучения процесса репликации мы нашли еще много способов повысить производительность. На тот момент внедрять их было слишком опасно, потому что главную причину проблемы они не решали. Но после исправления изначальных неполадок мы решили использовать полученные знания о репликации для дальнейшего улучшения работы серверов.
В результате общая производительность заметно улучшилась, и среднее время кадра на сервере уменьшилось на 15% по сравнению с тем, что было до августовских проблем. Кроме того, благодаря изменениям время кадра стало стабильнее по всех регионах.
Начиная с выхода патча 5.07 более 99,3% кадров на сервере отвечают нашим требованиям для тикрейта 128, а значит, VALORANT стала работать лучше и стабильнее, чем когда-либо.
На этом графике показано изменение времени кадра на сервере с выходом новых патчей. Каждая линия соответствует количеству клиентов – от стандартных 10 до 22. После большого скачка времени кадра в патчах 5.03 и 5.04 мы исправили ситуацию, и в патче 5.05 вы уже видите нормальные значения. А в результате значительных улучшений в патче 5.07 производительность сервера увеличилась на 15% по сравнению с данными до резкого снижения.
Урок усвоен
Для решения проблемы понадобилось много людей: разработчиков, киберспортивных партнеров, тестировщиков, продюсеров, руководителей и разных специалистов, которые помогали нам и давали информацию. Этот инцидент многому нас научил.
- Наблюдение за нестандартными матчами. Наше внимание было сосредоточено на типичных играх с установкой Spike и 10 игроками, поэтому наши данные не позволяли увидеть проблему при увеличении числа клиентов, и масштаб катастрофы был неясен, пока мы не составили новые графики. Теперь у нас есть методы проверки быстродействия в нестандартных матчах, в которых больше 10 участников.
- Более тщательное тестирование для нестандартных режимов игры. Обычный игровой режим с 10 участниками остается для нас приоритетным, но также мы планируем разработать методы тестирования производительности при участии 22 клиентов. Поскольку такие матчи проводятся редко, для сбора данных нужно регулярно проводить тесты, имитируя нужные условия. Сейчас мы делаем это с каждым обновлением, а не только перед крупными турнирами. Возможно, в дальнейшем процедуру тестирования надо будет изменить.
- Развитие экспертов. Это займет немало времени, но наличие специалистов узкого профиля в команде поможет заполнить пробелы в знаниях и повысить эффективность коллектива в целом. В процессе решения проблемы несколько наших разработчиков хорошо изучили репликацию, и это отличный задел на будущее.
- Сведение рисков к минимуму. Мы проводили Champions 2022 в момент выхода патча, да еще и сразу после обновления движка Unreal Engine. Это создало дополнительные риски. Конечно, мы хотим, чтобы крупные турниры проводились в актуальном состоянии игры: с новыми агентами, правками баланса и так далее, но теперь постараемся не обновлять VALORANT прямо перед началом соревнований. А если это будет совершенно необходимо, то мы с особой тщательностью проверим, чтобы все работало как надо.
Мы продолжим делать VALORANT еще лучше, чтобы вам было комфортнее играть. Всем удачи в матчах с тикрейтом 128!