Достраивая интернет: как Riot Games борется с проблемами соединения в League of Legends — Создание альтернативных маршрутов глобальной сети

Сотрудник Riot Games Пейтон Мейнард-Коран рассказал в блоге компании, почему современный интернет не подходит для онлайн-игр, и как команда Riot Direct разработала собственную магистральную сеть для комфортной игры в League of Legends.

Редакция vc.ru публикует перевод статьи, выполненный изданием DTF.

469600b79dc138.jpg

В League of Legends счёт идёт на миллисекунды. В повседневной жизни две секунды пролетают незамеченными: вы только что потратили их на чтение этого предложения. Но в игре двухсекундная задержка будет длиться целую вечность. За каждый матч League of Legends игроки принимают тысячи моментальных решений — и от них зависит, какая команда будет писать в чат «гг изи», а какая — получит значки «почётный противник».

7dc8948dd54e7a.jpg Я работаю системным администратором в Riot Games и состою в команде Riot Direct, работающей с этими миллисекундами. Когда передача данных между компьютером и нашими серверами замедляется, игрок не может вовремя принимать внутриигровые решения. Очень неприятно подводить всю команду из-за проблем со связью. Riot Direct обеспечивает геймерам максимально быстрое соединение.

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

Почему интернет не создан для таких приложений? Вы можете подождать пару секунд, когда браузер отправляет GET-запрос на Rotten Tomatoes, чтобы получить отзывы на последний фильм бондианы. Нужная вам информация всё равно вскоре появится. Сложно представить ситуацию, в которой вам было бы необходимо получить отзыв на фильм в следующую долю секунды. Но игроку в League of Legends «информация» нужна в максимально короткие сроки.

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

Оптоволоконная паутина

Интернет позволяет передавать огромные объёмы информации, на которой держится современный мир. Благодаря ему появились новые бизнес-системы, способы общения и игровые возможности. Но в некоторых областях глобальная сеть начинает приближаться к «потолку». Геймеры, которым нужно минимальное время отклика, уже испытывают неудобства, связанные с принципами работы всемирной сети.

Интернет — не единая система, а скорее объединение множества объектов. Когда вы играете в League of Legends, информация с серверов Riot отправляется в магистральные компании (такие как Level3, Zayo и Cogent), от них — интернет-провайдерам, вроде AT&T и Verizon, и только потом вам. Точно так же всё работает и в обратную сторону.

Магистральные компании обмениваются информацией с интернет-провайдерами через оптоволоконную сеть, проложенную через всю страну вдоль железных дорог. Она использует BGP (протокол пограничной маршрутизации) для распределения трафика. К сожалению, этот протокол создаёт ситуации, когда интернет-трафик должен пройти по оптимальному пути между двумя точками, но вместо этого маршрут получается петляющим и неэффективным.

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

13d865acc5fb0c.jpg

Рассмотрим путь трафика, который прислал нам игрок. Трафик между Сан-Франциско и Портлендом должен проходить напрямую. Вместо этого он идёт от Сан-Франциско до Лос-Анджелеса, потом до Денвера, затем в Сиэтл, и только потом до конечного Портленда. Прямой маршрут обеспечил бы задержку всего в 14 мс (миллисекунд), но менее эффективный путь занимает уже 70 мс. Пятикратный рост просто ненормален: он допустим для провайдеров и магистральных компаний, но не для игр вроде League of Legends.

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

Был бы буфер

Современное устройство интернета отлично подходит для стриминговых сервисов, таких как Netflix. Буферизация контента не позволяет заметить низкую скорость отклика. Пятисекундный отрывок видео сохраняется в буфер, и у следующей порции данных есть пять секунд, чтобы дойти до устройства. Трафик может пройти через сотню точек по всему миру, а из-за буферизации для пользователя всё будет выглядеть так, будто пакеты шли по кратчайшему маршруту. Однако при игре в League of Legends, где не загрузить в буфер информацию «из будущего», подобная задержка неприемлема.

3f207427b989ec.jpg

Роутеры только мешают

В дополнение к лагам и невозможности буферизации — сетевые роутеры, неотъемлемая «железная» часть интернета. Маршрутизаторы тоже усугубляют проблему: дело в том, как они работают с пакетами при передаче по проводу.

Большая часть интернет-трафика разбивается на пакеты по 1500 байт. Представьте, что эти пакеты — «грузовые фуры» интернета, с их помощью передаются все картинки, видео или музыка. И все эти пакеты «весят» именно 1500 байт. Это обусловлено MTU (максимальным передаваемым модулем данных) для второй версии Ethernet.

Однако игровой трафик делят на пакеты по 55 байт. Для игр необходимо постоянное обновление данных, но любой пакет сам по себе «весит» очень мало. В то время как Netflix отправляет значительные объёмы информации о следующем HD-кадре, «сообщением» в League of Legends может быть место на карте, куда игрок кликнул правой кнопкой мыши.

Проблема роутеров — в обработке служебных сигналов, которая должна направлять каждый отдельный пакет, независимо от его размера. Роутеры считают не «вес» пакетов, а их количество. Например, два пакета определённого «веса» содержат ту же информацию, что и один объединённый, но удваивают нагрузку на обработку сигналов. Постоянный поток пакетов League of Legends по 55 байт нагрузит обработку в 27 раз сильнее, чем стандартный, размером в 1500 байт. Почувствуйте разницу.

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

5509cb3ae1d56d.jpg

В первом случае проблема возникает с буфером ввода роутера. Пакеты задерживаются в нём, чтобы устройство успело их обработать. Несмотря на то, что у буфера фиксированный размер, скажем, 10 Мбайт, в нём может храниться ограниченное количество пакетов. Как только буфер заполнится — роутер начнёт «выбрасывать» следующие пакеты. Так как League of Legends генерирует в 27 раз больше пакетов — буфер пропорционально наполняется быстрее. Если вас интересуют отдельные технические аспекты, можно ознакомиться с работой коллег из Стэнфорда » Определение размеров буферов роутера».

b0455c9e5befe7.jpg

Во втором случае игровой трафик обрабатывается многими (но не всеми) роутерами двумя протоколами: UDP и TCP. Большая часть игр использует UDP из-за высокой эффективности и скорости. Но когда процесс маршрутизации роутера переполняется трафиком, многие устройства начинают игнорировать UDP пакеты — эти данные просто исчезают.

Такая система — следствие надёжности TCP-пакетов. Если они не доходят, получатель создаёт новый пакет и отсылает его отправителю, чтобы получить недостающие данные. Рано или поздно информация дойдёт до получателя в полном объёме.

Интернет-роутеры создаются с пониманием этого принципа и появления нового пакета при его игнорировании, так что, «выбрасывая» данные, они не снизят нагрузку на систему. А вот если избавиться от UDP-пакета — это поможет. Правило актуально и для «надёжных UDP» — технологии, созданной для обеспечения доставки UDP-пакетов, которая часто используется в онлайн-играх. Роутеры не умеют различать «обычные» UDP-пакеты и «надёжные».

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

Коротко о проблеме

5d1cc7183e8a00.jpg

Перечисленные факторы показывают, что устройство интернета далеко не идеально подходит для игры в League of Legends: итоговая задержка и потеря пакетов — это раздражающие лаги для игроков. Игровому трафику нужен новый принцип работы, который устранил бы неэффективное использование оптоволоконных путей, BGP и настроек роутера.

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

Далее мы расскажем о технических нюансах, которые команда Riot Direct использует для решения проблемы.

9c57d47aeadb63.jpg

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

Грубо говоря, мы берём это:

И превращаем в это:

Легко? Нет, этот проект занял у нас чуть больше года. Чтобы соединить наши сервера с серверами провайдеров, пришлось приобрести роутеры, арендовать для них помещения в десяти крупнейших интернет-хабах США, подключить сервера с помощью оптоволокна и тёмного волокна (dark fiber), и, наконец, договориться о совместной работе со всеми провайдерами.
9140823ab2667f.jpg

Роутеры, интернет-хабы и тёмное волокно

Купить оборудование было несложно. Далее нужно было разместить его в дата-центре. Помещения для совместного размещения (co-location) — это огромные здания, которые предоставляют пространство и мощности для сетевого оборудования. Разные операторы размещают «железо» в одном месте, что позволяет им без проблем подключаться друг к другу. Например, наше оборудование расположено в помещении Zayo в Нью-Йорке, и мы подключены ко всем размещённым там провайдерам.

c9292df66f95bc.jpg

Хотя совместное размещение позволяет подключиться сразу ко многим из них, это, к сожалению, не означает, что всё просто. Каждое из подключений требует бумажной волокиты и сложной системы работы аппаратуры. Для примера возьмём нашу точку присутствия (PoP, Point of Presence) в Нью-Йорке. Там также находится оборудование Zayo, Telx и Equinix (и другие провайдеры).

Для подключения к ним нужно пользоваться услугами Telx и Equinix, чтобы наши кабели подключались к коммутационным панелям в Meet Me Rooms (MMR). Мы также должны работать с Zayo для кросс-соединения (cross-connects) с нашим оборудованием. Это занимает целую вечность.

b05bc629ee812b.jpg

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

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

Могут возникнуть и другие трудности, которые легко пропустить. Изучая маршрут от Чикаго до Лос-Анджелеса, проходящий через Сиэтл, мы заметили, что в нём использовалось то же оборудование, что и в существующем маршруте между Чикаго и Сиэтлом. Использование двух маршрутов привело бы к появлению в системе единой точки отказа. Отключение роутера в Сиэтле вызвало бы огромные задержки у пользователей. Мы понимали, что нужно найти идеальное соединение между Чикаго и Лос-Анджелесом.

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

Почему не сделать проще

Учитывая все трудности, можно спросить, почему мы просто не заключили договор с основными операторами связи, чтобы они сами занялись работами. Ответ прост: мы пытались, ничего не вышло. К сожалению, наши требования не совпали с их принципами.

Провайдеры создают сети, похожие на общественный транспорт: они стараются получить трафик из как можно большего числа мест. Уменьшение количества участвующих в работе роутеров нормализует задержку в игре, но также снижает число пользователей их сети. Провайдеры часто создают сети вместе с другими компаниями. Это значит, что такие серьёзные решения зависят от рыночных отношений, а не от интереса игроков единственного приложения.
668da869241c1e.jpg

Если бы мы работали с AT&T — они не стали бы объединяться с Comcast, чтобы мы могли подобраться ближе к игрокам, пользующимся услугами последней. Они не партнёры. AT&T также не стала бы убирать роутеры из своей сети, чтобы наша работала максимально эффективно.

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

К тому же, инфраструктура провайдеров не подходила под наши требования. Представьте операторов «А» и «Б», которые соединяют Нью-Йорк и Чикаго. Соединение «А» быстрее, но провайдер «А» не связывает Чикаго и Сиэтл, что делает провайдер «Б». Единственная компания не может обеспечить магистральные услуги.

Устанавливаем стандарты

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

Существуют правила, по которым перемещается трафик. Они менялись незначительно и всё ещё работают для многих типов данных, но не для игры, которая не может буферизировать информацию.

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

Нельзя забывать и о времени сеанса работы в BGP. Оно определяет, как долго используется конкретный маршрут. Представьте два маршрута между Riot и определённым провайдером: быстрый маршрут «А» и медленный «Б». Если «А» выходит из строя, то трафик переводится на «Б» — всё логично, потому что это лучший доступный маршрут. Но когда маршрут «А» вернётся к работе, провайдер продолжит использовать «Б», потому что сеанс работы последнего продолжительнее, а значит — приоритет отдаётся ему.

Это происходит из-за стандартной работы протокола. Для провайдера с большим количеством соединений нужно проделать меньше работы, а не переключать трафик вручную на правильный маршрут. Нам пришлось найти способы решения подобных проблем. В приведённом примере мы специально отключаем «Б», чтобы перевести трафик на «А».

8b9774b23d3472.jpg

Также нужно было учесть, как мы получаем и передаём трафик. В большинстве случаев всё легко — провайдер расположен в одном месте. Но при работе с компаниями, располагающими оборудование по всему континенту, нужно подключаться в нескольких точках сразу. Возьмём для примера Comcast — её маршрутизаторы расположены по всей стране. Подключившись к ним только в Чикаго, мы лишим подключения к нашей сети игроков из, скажем, Бостона.

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

b2a117b5d99d1a.jpg

Но есть и другая проблема — на обратном пути трафика. Когда BGP определяет количество точек для направления пакетов в автономную систему и из неё, протокол стремится найти «ближайшую» точку выхода. Другими словами, BGP принимает трафик, идущий в наш дата-центр, через лучшую точку входа, но выбирает единственную точку выхода для всего обратного трафика, вместо выбора наилучшего варианта.

Начиная создавать собственную магистральную сеть, мы соединились с провайдером в Портленде и Чикаго. Игроки из Чикаго входили в нашу сеть через точку соединения в Чикаго: когда мы отправляли обратный трафик, он шёл по тому же маршруту.

Но когда игроки из Портленда заходили в сеть через точку соединения в Портленде, обратный трафик шёл из Чикаго, а не из Портленда. Пиринговый роутер провайдера направлял трафик из Портленда, и быстрейший путь до нашей автономной системы был в Портленде. А когда игровые серверы отправляли обратный трафик, BGP рассчитывал быстрейший и наиболее логичный путь до автономной системы провайдера, который выходил в Чикаго.

Пришлось работать с провайдером. Компания начала маркировать наш трафик с помощью BGP Community или предпочтений MED, что позволило нам правильно регулировать обратный трафик.

b442a80b9cd50f.jpg

Это была серьёзная работа. И, к сожалению, не все провайдеры ей занимаются. Мы можем подключиться напрямую к провайдеру, но скорость соединения у игроков всё равно будет низкой.

Результаты

Учитывая все препятствия, можно подумать, что наша затея изначально была обречена на провал. Однако мы медленно и верно прорабатывали каждый шаг. Когда мы смотрим на результат работы в Северной Америке, то видим, что нам удалось создать одну из самых быстрых сетей на континенте. С таким опытом мы можем проводить улучшения всё быстрее и быстрее.
383adfed1b4bd1.jpg

Но настоящий критерий оценки нашей работы — данные от игроков. Одним из способов его измерения стала проверка количества геймеров, у которых пинг не поднимается выше 80 мс. После нашего переезда в Чикаго показатель вырос с 31% до 50% всего за девять месяцев. За это время мы начали подключаться к сетям провайдеров и работать в составе команды Riot Direct. Общий рост приведён в таблице ниже.

Это не значит, что каждый игрок заметил улучшения, но большая часть геймеров стала играть в League of Legends с нормальным пингом. Как только мы перенесли игровые сервера в Чикаго, показатели стали ещё лучше. За одну ночь количество игроков с приемлемым пингом выросло с 50% до 80%! Мы добились поставленных задач, и даже больше.

Мы продолжаем работать с провайдерами и операторами, чтобы предоставить игрокам ещё лучшие условия — во всём мире. У нас есть сети на всех континентах, кроме Антарктиды и Африки.

Работы предстоит ещё немало. Мы уверены, что у игр должны быть собственные сети, и что старые технологии, вроде BGP, просто не подходят для них.

Теги

Статьи по теме

©  vc.ru