Перейти к содержимому

Донат
На хостинг
ISK за переводы
до 75kk за 1000зн.
Хроники EVE
Сборник
Новичкам
Полезная информация
Фотография

CarbonIO и BlueNet


  • Авторизуйтесь для ответа в теме
19 ответов в теме

#1
Alhimik

Alhimik

    Clone Grade Zeta

  • Tech III Pilots
  • PipPipPip
  • 364 сообщений
1
  • EVE Ingame:Alh1m1k
  • Corp:-FDE-
  • Client:Рус
Оригинал тут
Перепост отсюда


Многие игроки в EVE знают, что наша игра написана на языке программирования Python – если быть точнее, Stackless Python. Stackless ― это усовершенствованная версия интерпретатора, позволяющая пользоваться многими преимуществами многопоточного программирования. Но, тем не менее, «питон» остается «питоном», и нам приходится иметь дело с глобальной блокировкой интерпретатора (Global Interpreter Lock, также известной как «этот чертов GIL» или просто GIL).
GIL ограничивает доступ к интерпретатору (и всем соответствующим данным): в каждый конкретный момент времени обрабатывается лишь один поток. Поэтому хотя Stackless Python и обладает многими признаками «многопоточного» языка (такими как разделение задач, каналы, планировщики, совместная память, и т.д.), написанная на нем программа все равно способна обрабатывать лишь одну задачу за раз. Это похоже то, как работали некоторые многозадачные операционные системы в прошлом ― и такая схема позволяет гарантировать, что исполнение каждого потока не будет прервано в какой-то момент времени (за исключением тех случаев, когда поток нарушает принципы проблемы остановки). Это также позволяет нам исходить из многих предпосылок о глобальном состоянии игры при написании кода, что было бы невозможно, если бы мы использовали асинхронную логику и функции обратного вызова. По сути дела, большая часть логических блоков в коде нашей игры следуют принципам процедурной синхронной модели, что позволяет быстро и безболезненно вносить изменения в код.

Проблема заключается в том, что часть «фреймворка» в EVE Online написана на Python, и поэтому нам приходится использовать GIL. Это ограничение распространяется и на написанные на языке C модули, которым необходимо получать данные от интерпретатора Python.

Изображение
Все задачи, работающие с Python, должны перед выполнением «получить» GIL;
программа, по сути дела, выполняется в один поток.
(прошу прощения за некрасивый график; я программист, а не художник)

Проще говоря: код, написанный на Stackless Python, исполняется так быстро, как позволяет самое быстрое ядро процессора. В случае четырех- или восьмиядерного процессора использоваться будет лишь одно ядро; впрочем, остальные могут использоваться для обработки других процессов. Это хорошо работает в тех случаях, когда эти процессы не сильно зависят от других компонентов системы, но не подходит для таких задач, как обработка действий игроков, находящихся в космосе или гуляющих по станциям.
Пока один процессор справляется со всей нагрузкой ― а во многих случаях это так и есть ― никаких проблем не возникает. Но не мне вам рассказывать, что в настоящий момент одного процессора уже не хватает для обработки больших боев, несмотря на то, что команда Gridlockи  другие разработчики выжимают из системы все возможное, оптимизируя код. В настоящее время процессоры не становятся быстрее ― увеличивается объем кэша и пропускная способность шины, но с точки зрения того, что необходимо нашей игре, их скорость не растет. Задача, которую нам предстоит решить в недалеком (и, возможно, в далеком) будущем ― обеспечить возможность использования кодом игры несколько процессоров одновременно.
В общем и целом, дальнейшее развитие многоядерных процессоров теоретически открывает интересные возможности перед EVE – кластер игры устроен таким образом, что при использовании процессоров с более чем 30-60 ядрами мы получим значительные преимущества по сравнению с текущей архитектурой. Но в настоящий момент перед нами стоит более достижимая задача ― сделать определенные элементы «фреймворка» (сетевое взаимодействие и процессы ввода/вывода данных) независимыми от GIL.
Эта проблема возникла не вчера: необходимость повышения быстродействия важных компонентов нашей игры (для которых не требуется использовать Python) назрела уже давно. CarbonIO – гигантский шаг в этом направлении.

CarbonIO ― естественное развитие StacklessIO. По сути дела это написанный с нуля «движок», при разработке которого перед нами стояла главная задача: сделать сетевой код ― и любой код, написанный на C++ ― полностью независимым от механизма GIL. Вторая часть этой задачи ― большое начинание, на реализацию которого ушел почти год.

Краткий экскурс в историю: предыдущим большим шагом на этом пути являлся механизм StacklessIO (http://www.eveonline...?a=blog&bid=584). Он позволил обрабатывать сетевые операции на уровне операционной системы и передавать результаты интерпретатору Python по мере необходимости.


Изображение
stacklessIOпозволяет завершать обработку запросов Python, не прибегая к GIL


  CarbonIO ― это следующий этап развития этой системы. Многопоточный «движок», отвечающий за коммуникации, был полностью отделен от механизма GIL; он может отправлять и принимать данные без взаимодействия с интерпретатором Python.
  Это стоит повторить еще раз: система CarbonIO может отправлять и получать данные без взаимодействия с интерпретатором Python. Параллельно. В обход механизма GIL.
Когда через систему CarbonIO устанавливается соединение, немедленно вызывается функция WSARecv(), и начинается сбор данных. Эти данные расшифровываются, распаковываются и в несколько потоков собираются в пакеты; это происходит параллельно с работой интерпретатора Python. Затем эти пакеты помещаются в очередь, где они ждут вызова от Python.
Когда для работы написанного на Python кода требуется один из таких пакетов, в систему CarbonIO отправляется вызов ― и эти данные, скорее всего, уже там есть. Данные вынимаются из очереди и возвращаются в нее без участия механизма GIL – это происходит практически мгновенно. Вот первое преимущество, которое обеспечивает система CarbonIO – возможность осуществлять параллельное опережающее считывание.
Второе преимущество касается отправки данных. Специальный поток Python собирает и отправляет данные; при этом сжатие, шифрование, сбор их в пакеты и вызов функции WSASend() осуществляются в обход механизма GIL в другом потоке, и операционная система может запускать этот поток на другом процессоре. В принципе, это можно было делать и в рамках StacklessIO ― но это не имело бы никакого смысла без других изменений, которые мы реализовали.
Вернемся чуть-чуть назад. «Эти данные, скорее всего, там уже есть?» Хмм. Что, если создать функцию обратного вызова, которая позволяла бы модулю, написанному не на Python, получать эти данные без использования системы Machonet? Встречайте: система BlueNet.


Изображение
Система CarbonIOпостоянно выполняет цикл recv-loopи может обращаться к написанным на С++ модулям без участия Python.


Система Machonet выполняет ряд важных функций ― маршрутизация, управление сессиями, постановка пакетов данных в очередь и их отправка; по сути дела, это «нервная система» EVE. Она написана на Python, поэтому все данные со всех узлов сервера EVE обязаны в какой-то момент проходить через GIL. Как бы быстро не исполнялся написанный на C++ модуль, его быстродействие все равно будет ограничено этой системой. Поэтому мы не приступали к оптимизации многих написанных на C++ элементов кода ― ведь любой выигрыш сводился бы на нет ограничениями, связанными с механизмом GIL и системой Machonet.

Но это осталось в прошлом.

Теперь написанный на C++ модуль может принимать и отправлять через систему BlueNet пакеты, для обработки которых механизм GIL не требуется. Это нововведение было реализовано для проекта Incarna― ведь для передвижения персонажей требуется передача больших объемов данных. Мы подсчитали, что при использовании старой системы Incarna буквально «положила» бы сервер Tranquility даже при средней длительности игрового «тика». BlueNet позволяет решить эту проблему, направляя сетевой трафик между написанными на C++ модулями (такими как физический «движок») в обход механизма GIL; эти данные не приходится дважды пропускать через систему Machonet, что позволяет добиться значительного выигрыша.
Как именно это работает? BlueNet хранит копию всех необходимых структур Machonet и добавляет ко всем пакетам маленький заголовок (8-10 байт), где содержится информация о маршрутизации. Когда система BlueNet принимает пакет, она может прочесть этот заголовок и направить пакет дальше ― на другой узел или на модуль C++, исполняемый на том же процессоре. Пересылка пакета осуществляется в обход механизма GIL; Machonet/Python никак в этом процессе не участвуют. Это значит, что наши прокси-серверы могут полностью параллельно обрабатывать пакеты BlueNet, вообще не прибегая к связанным с Python процессам. Насколько это эффективно? Мы пока не знаем, какое слово выбрать для того, чтобы описать уменьшение лага и нагрузки на процессоры в ряде случаев ― «потрясающе» или «невероятно». Серьезно ― мы сами не верим своим глазам.
В дополнение к описанному выше, при работе над CarbonIO мы реализовали ряд других нововведений; каждое из них незначительно повышает быстродействие системы, но все вместе они дают хороший результат. Некоторые из которых стоит упомянуть отдельно:

Группировка запросов

В рамках этой статьи сложно рассказать об этом нововведении, но, грубо говоря, система CarbonIO очень эффективно «группирует» запросы перед их обработкой. Для выполнения некоторых операций всегда требуется некоторое дополнительное время; это преимущественно касается сетевых протоколов, но применимо и к другим аспектам программирования. Это время можно сократить, «сгруппировав» эти операции. Например, в EVE и раньше группировались пакеты данных для отправки в рамках единого TCP/IP MTU, но CarbonIO позволяет группировать и другие операции. Хороший пример этого связан с работой механизма GIL.
При возникновении первого потока, обращающегося к механизму GIL, создается очередь; другие потоки добавляют соответствующие вызовы (wake-upcall) в ее конец. Когда GIL освобождается, первый поток очищает всю очередь без необходимости повторно отменять и получать GIL для каждого wake-upcall. Эта ситуация часто возникает при высокой нагрузке на сервер, и использование CarbonIO позволяет получить здесь значительное преимущество.

Интеграция openSSL

Механизм SSL в системе CarbonIO реализован с помощью протокола openSSL, который работает без участия механизма GIL ― вся маршрутизация осуществляется через CarbonIO с использованием так называемых «completion ports». Это позволит нам не только лучше защитить EVE от несанкционированного доступа, но и в перспективе перенести для удобства некоторые функции управления учетной записью непосредственно в игровой клиент.

Интеграция сжатия

CarbonIO осуществляет сжатие и распаковывание пакетов данных с помощью библиотек zlib и snappy; опять же, этот процесс не зависит от механизма GIL.


Полевые испытания

Данные, собранные за 24 часа работы типичного прокси-сервера игры (примерно 1600 пользователей в пиковый период), показывают, что использование CarbonIO позволяет значительно сократить нагрузку на процессор (как абсолютную, так и в расчете на одного пользователя). По мере роста нагрузки на сервер эффективность CarbonIO снижается ― влияние оптимизаций уступает место количеству обрабатываемых операций ― но все равно остается довольно высокой.


Нагрузка на CPUна одного пользователя за 24 часа

Изображение


Нагрузка на CPU(в %) за 24 часа

Изображение

На работу серверов, обрабатывающих звездные системы, CarbonIO влияет меньше ― ведь нагрузка на них связана преимущественно с кодом игры, а не с сетевым взаимодействием ― но и здесь нам удалось получить выигрыш в 8-10%.

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

Подводя итоги

Что это значит для сервера EVE? После внедрения системы CarbonIO мы сможем лучше использовать возможности современных процессоров ― это непосредственно касается и быстродействия игры. Чем меньше кода обрабатывается с использованием механизма GIL, тем эффективнее работает вся система. CarbonIO и BlueNet открывают перед нами двери в новый мир ― нам еще предстоит узнать, насколько мы сможем повысить быстродействие всей системы в целом, но можно смело сказать, что большой «затор» на этом пути устранен.



- CCP Curt

Сообщение отредактировал Alhimik: 22 June 2011 - 8:24

  • 5

#2
OSH1m@

OSH1m@

    Clone Grade Ksi

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPip
  • 10694 сообщений
67
  • EVE Ingame:Osh1mA
  • Channel:Russian
  • Client:Eng
Блин так дохрена написано, вкратце можете рассказать, что они там намутили о5?? :m0201:
  • 0
"Вокруг черной дыры же дофига фотонов! Почему же она не светится как ЗВЕЗДА! Ха-Ха ваша наука ПАСУЕТ перед этим ФАКТОМ!"(с)6xlfgK.png

#3
eclampsia

eclampsia

    ^.^

  • Tech III Pilots
  • PipPipPipPipPip
  • 2276 сообщений
175
  • EVE Ingame:Eclampsia
  • Channel:Eve Flight School
  • Client:Eng
Как я понял .. что то вроде... "мы делаем немногопоточное многопоточным с использованием самых современных костылей, карбон работает прекрасно на этих костылях и это дает нам новые возможности в изобретении все более прекрасных костылей - чем мы и занимаемся"

Сообщение отредактировал eclampsia: 21 June 2011 - 20:43

  • 2

I'm not in the game 2 years already.

 


#4
Anastasy

Anastasy

    Clone Grade Iota

  • Tech III Pilots
  • PipPipPipPipPip
  • 1662 сообщений
73
  • EVE Ingame:Anastasy BL
  • Corp:T R I B E
  • Ally:Minmatar Republic
  • Client:Eng
Любители фразы "переписали бы на С++" будут в экстазе :)
  • 1

#5
Snark

Snark

    Clone Grade Lambda

  • Tech III Pilots
  • PipPipPipPipPipPip
  • 5393 сообщений
1522

Блин так дохрена написано, вкратце можете рассказать, что они там намутили о5??

как ни странно, фиксят лаги :rolleyes:

Сообщение отредактировал Snark: 21 June 2011 - 21:13

  • 0

#6
CHoh

CHoh

    EVE Offline

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPip
  • 14227 сообщений
2348

Любители фразы "переписали бы на С++" будут в экстазе :)

C++, C++

Я всё жду, когда кто-нить ВНЕЗАПНО зафигачит пару страниц на Erlang с комментами про асинхронные/параллельные процессы, масштабируемость и распределённые вычисления.

Но из года в год апологетов этого ЯП на форуме не находится..

Всё ещё актуально :)
  • 1

#7
WeBForeveR

WeBForeveR

    Эцсамое

  • Tech III Pilots
  • PipPipPipPipPip
  • 1835 сообщений
48
  • EVE Ingame:WeBForeveR
  • Client:Eng
Вот если бы они своё поделие изначально не делали на Пейстоне, а, например, на Java (ну или на C++, чего уж там), то таких бы проблем не было, ага.
  • 0
Изображение

#8
Bunysmitt

Bunysmitt

    Изменилось?

  • Tech III Pilots
  • PipPipPipPipPip
  • 2034 сообщений
71
  • EVE Ingame:ny4erLa3ek
  • Corp:RGC
  • Ally:ROL
Предлагаю все переписать на Ruby!! Месяца за 3 осилят, думаю, легко!
  • 0

Проблема скорее в другом. Я слишком умный и знаю слишком много. Задумываюсь о странных вещах.

У нас всё также будут супера, а вы свои всё также не будете использовать.


#9
dread flash

dread flash

    Clone Grade Delta

  • Tech III Pilots
  • PipPip
  • 209 сообщений
-9
  • EVE Ingame:Dread F1ash
  • Corp:Drunk Gang
  • Client:Eng
Неужели CCP намекают, что пофиксят лаги? Как то сомнительно, слишком много текста<_<
  • 0
404 - File or directory not found.
The resource you are looking for might have been removed,
had its name changed, or is temporarily unavailable.

#10
DIMFIRE

DIMFIRE

    Кавайчег

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 29197 сообщений
2279
  • EVE Ingame:DIMFIRE Dimiana DlMFlRE
  • Client:Eng
Подведем итог. те кто говорил что питон гавно оказались таки правы?
  • 0

#11
Basil

Basil

    Карибас-неудачник

  • Tech III Pilots
  • PipPipPipPip
  • 624 сообщений
152
  • EVE Ingame:Basurmancheg
  • Corp:Viziam
  • Ally:None
  • Client:Eng

Подведем итог. те кто говорил что питон гавно оказались таки правы?

Скажем так. В современных играх динамические языки типа Питона или Луа используются вовсю, ибо на них удобно писать сценарии взаимодействия. А вот обработку данных и сетевой стек на Питоне делать не стоило в силу его врожденной однопоточности. В общем, каждому инструменту свое применение.
  • 3

#12
vmarkelov

vmarkelov

    Clone Grade Omicron

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 46296 сообщений
7474
  • EVE Ingame:Kej Lacitis
  • EVE Alt:Kej Al'tos
  • Corp:Space Mechanics
  • Ally:Circle of Hell
  • Client:Рус

Вот если бы они своё поделие изначально не делали на Пейстоне, а, например, на Java (ну или на C++, чего уж там), то таких бы проблем не было, ага.

К сожалению, история не знает сослагательного наклонения
  • 0

Не сожалей о том что было, не думай о том что могло быть.


#13
Huldir

Huldir

    Clone Grade Theta

  • Tech III Pilots
  • PipPipPipPip
  • 977 сообщений
15
  • Channel:local
  • Client:Eng
лишь бы эта новая многопоточность была стабильной. а там пусть делают что хотят. хомячки одобряют.
  • 0

#14
Gadsky

Gadsky

    Clone Grade Kappa

  • Tech III Pilots
  • PipPipPipPipPip
  • 1946 сообщений
423
  • EVE Ingame:Gadsky
  • EVE Alt:Gadsky II
  • Corp:Afrorussians
  • Client:Eng

Подведем итог. те кто говорил что питон гавно оказались таки правы?


Скажем еще так, в одном потоке питон ничуть не хуже, а местами и лучше прочих языков (типа быстрая разработка, ага, ну и хотспоты всякие тоже рулят). Другое дело, что GIL изначально ориентировал на однопоточность. В общем, "тут надо все переписать" :P . Но поскольку переписывать в здравом уме никто никогда не будет, то параллелят то, что сейчас под силу. Кстати, если бы сразу был другой язык, то еву мы, может быть, и вообще бы не увидели.

Сообщение отредактировал Gadsky: 21 June 2011 - 22:27

  • 0

#15
berdan

berdan

    Clone Grade Delta

  • Tech III Pilots
  • PipPip
  • 135 сообщений
6
  • EVE Ingame:Lexx Thai
  • Corp:NWRC
  • Ally:now like rogue drones
  • Client:Eng
Ндаа... сколько людей, столько и прочтений...

Обратил ли кто-нибудь внимание вот на это?

Поэтому мы не приступали к оптимизации многих написанных на C++ элементов кода ― ведь любой выигрыш сводился бы на нет ограничениями, связанными с механизмом GIL и системой Machonet.

Задача, которую нам предстоит решить в недалеком (и, возможно, в далеком) будущем ― обеспечить возможность использования кодом игры несколько процессоров одновременно.

Так что ликуйте, пипль - благодаря Инкарне (данных надо будет переваривать мнооого) CCP занялось потрохами игры.
  • 0
Если короче - "ССР, делайте то, что не делаете!" (с) FerrusManus

#16
Koh-i-Noor

Koh-i-Noor

    Clone Grade Epsilon

  • Tech III Pilots
  • PipPipPip
  • 342 сообщений
-50
  • EVE Ingame:Koh'i'noor
  • Corp:Green Tea Inc
  • Client:Eng
Похоже, что лаги таки пофиксили. Я удивлён.
  • 0

_koh2.jpg
Если человек очень сильно чего-нибудь хочет - он становится предсказуемым.


#17
DustCn

DustCn

    Clone Grade Beta

  • Tech III Pilots
  • Pip
  • 84 сообщений
8
  • EVE Ingame:Dnole
  • EVE Alt:Abs0lute Zero
  • Corp:Post Scriptum
  • Ally:Cit/Pet
  • Channel:PSR
  • Client:Eng
Еще немного и они прикрутят OpenMP к питону, а спустя несколько патчей обнаружат что на кластерах используется MPI.
  • 0
К сожалению у нас сейчас нет союзников, которых мы могли бы использовать... © RED

#18
Zasrak

Zasrak

    ...я антипод, себя, другого...

  • Tech III Pilots
  • PipPipPipPipPipPipPip
  • 6170 сообщений
3514
  • EVE Ingame:Zasrak
  • Corp:Wonder of War
  • Client:Eng
ОМГ они фиксят лаги?!? ВНЕЗАПНО!? Чорт, я на сегодня забуду про танчики...

А еще, порадовало: у них как бы многоядерные сервера, только эта многоядерность софту никуда не впилась. Это типа как на самые последние процы сейчас ставить ДОС 2.22 и Вин 3.11. с нортон командером.
  • 0
Zasлуженный Raботник Kультуры
Не создавая света, не пробивая стен, ты можешь быть известным, но в сущности - никем.

я не буду тебе что-либо доказывать и предъявлять. я скажу проще - убей в себе БВ

Об истоках проблем Бластер Ворма. Будьте осторожны!

#19
Li Anderson

Li Anderson

    Clone Grade Omicron

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 19824 сообщений
7614
  • EVE Ingame:Li Anderson
  • Corp:Watch your six
  • Ally:-DD-
  • Client:Eng

Блин так дохрена написано, вкратце можете рассказать, что они там намутили о5?? :m0201:

Они решили что будущее уже наступило и пора делать приложения использующие многоядерность!
  • 0

#20
Loardriver

Loardriver

    Clone Grade Kappa

  • Tech III Pilots
  • PipPipPipPipPip
  • 2688 сообщений
741
  • EVE Ingame:Loardriver
  • DUST Ingame:LrDr
  • Channel:Сручат
  • Client:Eng
В итоге на замес в грид будет набиваться по 3200 тел с каждой стороны, локал чат будет показывать over9000 вместе с репликами - ПОФИКСИТЕ ЛАГИ!!!
  • 2

В этой жизни можно всё, было-бы желание.





1 посетителей читают тему

0 members, 1 guests, 0 anonymous users