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

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

Gridlock, моникеры и CPU-per-user


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

#1
Tandi

Tandi

    Clone Grade Theta

  • Tech III Pilots
  • PipPipPipPip
  • 1341 сообщений
1798
  • EVE Ingame:-
  • Corp:-
  • Client:Eng
Это перепост официального перевода девблога взятый отсюда

Оригинал

Команда Gridlock продолжает усердно бороться с лагом в больших битвах и оптимизировать устаревший код игры. В конце апреля мы активировали на сервере Tranquility ряд мер, направленных на повышение быстродействия; несколько недель мы измеряли результаты, и, наконец, настала пора рассказать о них. Первыми о них услышал Совет игроков в ходе недавнего визита, а теперь о них узнаете и вы. Так что внимание, вас ждут графики и технический жаргон.

Для начала график (все любят графики!):


Изображение

На нем показано, сколько ресурсов процессора используется при обработке действий одного пользователя (в просторечии «CPU-на-игрока»); это среднее значение по всем серверам Tranquility за восемь недель. Хотя мы не используем в данном случае какие-то определенные единицы измерения, это сравнение вполне корректно, если конфигурация самих серверов остается неизменной. Чем ниже эта величина, тем лучше. Красным цветом отмечены линии тренда до и после изменений; синим ― даты, когда эти изменения были активированы на сервере. Подписи под линиями ― это названия флагов, которые мы использовали в коде (эта статья основана на отчете, написанном мной для коллег, поэтому я постараюсь придерживаться аналогичной терминологии).

Каждый флаг активирует определенный участок оптимизированного кода без необходимости устанавливать дополнительный патч на Tranquility. Это также позволяет нам «включать» флаги лишь на определенных серверах и следить за возникновением нежелательных последствий до их активации во всей игре.

Флаги

26 апреля мы активировали серверный флаг 'ballparkUsesInventorySelfLocal'. После этого изменения величина «CPU-на-игрока» уменьшилась примерно на 8%. Это более чем хороший результат для такого небольшого изменения (с точки зрения объема переписанного кода). Конечно, потребовалось гораздо больше времени усилий, чтобы понять, что именно надо изменить, и протестировать эти изменения.

2 мая мы активировали серверный флаг 'crimewatchUsesInventorySelfLocal'. Это не сильно повлияло на величину «CPU-на-игрока», но мы и не ожидали иного результата: повышение быстродействия в данном случае заметно лишь в ходе больших боев в «лоу-секе», и на общие результаты измерений оно значительно не влияет.

Если все, что вы хотите знать ― продолжаем ли мы все еще войну с лагом, то можете не читать дальше; на приведенном выше графике содержится вся необходимая информация. Серверные «хомячки» стали на 8% счастливее. Если же вам интересно, как именно мы этого добились, то я с удовольствием вам об этом расскажу.

Моникер ― что это такое

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

Основной способ коммуникации между серверными компонентами ― моникеры и связанные объекты. Моникер ― это указатель на связанный объект. Связанный объект «представляет» компонент и ведет учет количества моникеров, которые на него указывают. По сути дела это вариант реализациишаблона Proxy.

Ситуация становится более интересной, если учесть, что моникер и связанный объект могут обрабатываться разными процессами ― они даже могут находиться на разных серверах (в настоящий момент в состав Tranquility входит примерно 200 серверных «узлов»). По сути дела они могут находиться на разных континентах ― игровой клиент EVE использует те же инструменты для взаимодействия с находящимися на наших серверах объектах. Те из вас, кто занимается программированием, могут видеть, что это реализация механизма RPC. Это позволяет нам обрабатывать различные логические процессы на разных «узлах», используя интерфейс, практически идентичный тому, что используется на каждом узле. Но использование моникеров имеет и отрицательную сторону ― каждый доступ к моникеру требует проведения нескольких дополнительных проверок по сравнению со стандартным вызовом функции. Это обусловлено дополнительными функциями, которые выполняют моникеры ― управление «жизненными циклами» (в случаях, если сервер на другом конце соединения выходит из строя, или один из объектов уничтожается), синхронизацией вызовов (например, к одному связанному объекту не должно поступать два вызова одновременно) и контролем доступа для каждой функции (например, каждый пользователь может вызывать функцию А, но функция Б доступна только гейм-мастерам).

Изображение

На приведенной выше диаграмме показан вымышленный объект 'ServiceObject', к которому пытаются получить доступ два пользовательских объекта. Каждый сеанс доступа осуществляется через моникер; входящие соединения обрабатываются интерфейсом BoundObject. Черные стрелки ― это логические связи, которые могут находиться в одном пространстве памяти, на двух компьютерах в одной локальной сети или даже на разных концах интернета.

Как все это работает

Каждая звездная система в рамках сервера состоит из нескольких взаимосвязанных компонентов. В частности, три компонента, о которых пойдет речь ниже, называются Ballpark, CrimewatchLocation и InventoryLocation; в каждой звездной системе существует один экземпляр каждого из них. Ballparkотвечает за объекты в космосе (это включает в себя работу физического движка Destiny, отправку обновленной информации игровым клиентам, прыжки через врата и многое другое). CrimewatchLocationотвечает за флаги агрессии, применение правил войн между корпорациями, сообщения о потерях и появление кораблей CONCORD. InventoryLocationследит за тем, где находятся объекты, и выступает в роли «посредника» между сервером и базой данных объектов.

Доступ к InventoryLocation конкретной звездной системы с другого «узла» осуществляется через моникер (при условии, что нам известен идентификатор узла, и у нас есть соответствующие права доступа). Системы Ballpark и CrimewatchLocation также работали по схожему принципу и взаимодействовали с InventoryLocation через моникер.

Изображение

На этой диаграмме показана связь между системами Ballpark, CrimewatchLocation и InventoryLocation до и после изменения. В первом случае на соединения моникеров накладывались ограничения: они должны были обрабатываться одним и тем же процессом из-за зависимости от других объектов.

Здорово. На первый взгляд может показаться, что правильное решение ― вынести каждый компонент на отдельный «узел» и воспользоваться преимуществами, предоставляемые параллельной обработкой данных. Но для каждой звездной системы эти системы всегда существовали на одном и том же «узле»; со временем они начали использовать другие общие компоненты (не моникеры) и буквально «срослись» друг с другом. Поэтому их разделение ― нетривиальная задача: Ballpark, CrimewatchLocation и InventoryLocation не только обзавелись общими органами, но и постоянно общаются между собой. Время, затрачиваемое на коммуникации между этими системами, не позволяет получить значительное преимущество от параллельной обработки данных, не переписав значительную часть серверной архитектуры.

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

Исправляем ситуацию

Итак, мы имеем дело с тремя компонентами, общающимися между собой с помощью RPC – но они всегда находятся «в одном пространстве». После того, как я убедился, что использование моникеров заметно снижает быстродействие в этом случае, я начал избавляться от них. Замена моникера на прямую ссылку ― тривиальная задача; ведь вся необходимая функциональность уже реализована.

Вот в чем заключалось изменение:

До:
В момент инициализации:
# Get the moniker to an inventory location:
inv = GetInventoryMoniker(solarsystemID)

В ходе выполнения программы:
# Use the inventory to get stuff from the DB:
item = inv.SelectItem(itemID)

После:
В момент инициализации:
# Get the direct reference to an inventory location:
inv = GetInventoryMoniker(solarsystemID).GetSelfLocal()

В ходе выполнения программы:
# Use the inventory to get stuff from the DB:
item = inv.SelectItem(itemID)

Вот и все. Пятнадцать символов, которые «выключают» часть кода и сокращают использование ресурсов процессора на 8%. Неплохо, а?

Исправляем исправления

Но это не все! Помните, я упоминал, что моникер не только обеспечивает работу механизма RPC, но и делает кое-какие другие полезные вещи ― например, управляет «жизненными циклами» в системе путем подсчета ссылок? Связанные объекты существуют лишь пока существуют ссылающиеся на них моникеры; после исчезновения последнего моникера удаляется и связанный объект. На эту проблему мы и натолкнулись в ходе тестирования: выяснилось, что моникер компонента CrimewatchLocation, ссылающийся на InventoryLocation, ― единственное, что «поддерживало жизнь» этого компонента. Это привело к очень странным ошибкам. Например, звездная система работала нормально, пока для какого-либо игрока в ней был задан флаг агрессии, но как только компонент CrimewatchLocation оставался без дела, работа InventoryLocation прекращалась ― хотя компонент Ballpark продолжал ссылаться на нее.

Как только мы устранили эту проблему, мы провели ряд массовых тестов, активировав соответствующие флаги; другие потенциальные проблемы мы нашли в ходе дальнейшего тестирования на сервере Singularity.

В завершение

Как только тестирование было завершено, мы реализовали эти изменения на сервере Tranquility в «спящем режиме». В конце апреля выдалась спокойная неделя (без установки патчей), и эти изменения были активированы ― 26 апреля мы включили соответствующий флаг для компонента Ballpark, а 2 мая ― для CrimewatchLocation. Это время было выбрано не случайно ― в этот период у нас была возможность спокойно измерить полученные преимущества (и установить возможные проблемы) и при необходимости выключить один флаг или оба.

После нескольких дней на Tranquility никаких проблем обнаружено не было; несколько недель спустя мы собрали достаточно данных, чтобы утверждать, что 30 дополнительных строк кода (не считая исправления некоторых ошибок, связанных с «жизненными циклами») позволили в среднем повысить быстродействие на 8%. Неплохо, а?

Эта статья рассказывает лишь о части работы, которой занимается команда Gridlock. Мы также организуем массовое тестирование, изучаем реализуемые другими командами нововведения, чтобы убедиться, что они не оказывают отрицательного эффекта на быстродействие игры, и работаем над более масштабными проектами. Среди них ― перенос звездных систем на отдельные сервера в режиме реального времени (для масштабных боев) и проект TimeDilation.

- CCP Atlas

Сообщение отредактировал Tandi: 16 June 2011 - 20:46

  • 6

#2
DIMFIRE

DIMFIRE

    Кавайчег

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28676 сообщений
2236
  • EVE Ingame:DIMFIRE Dimiana DlMFlRE
  • Client:Eng
Напомните мне пожалуйста, когда ццп последний раз обновляло железо? Год назад? Два?

В данный моент удвоение мощьностей происзходит каждые 8-10 месяцев. И решение проблемы лагов за счет апдейта железа-одно из наиболее логичных в данном случае(после переписывания кода с нуля под многопроцессорность естественно)

Сообщение отредактировал DIMFIRE: 16 June 2011 - 20:41

  • -2

#3
CHoh

CHoh

    EVE Offline

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPip
  • 14115 сообщений
2327
У товарищей из гридлока та же беда, что и у дизайнеров ццп - абстрактные цифры мало о чём говорят, нет чего-то понятного для осознания масштаба изменений.
Например, "теперь будет начинать сурово лагать не при 600 в локале, а при 648". ;)

(про дизайнеров - это я неосознаваемые размеры кораблей имел в виду)


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

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

  • 0

#4
delightman

delightman

    Clone Grade Beta

  • Tech III Pilots
  • Pip
  • 74 сообщений
1
  • Client:Eng
Поправьте меня пожалуйста...

Они просто реализовали Singleton вместо постоянной реинициализации???
  • 0

#5
reiser

reiser

    Clone Grade Zeta

  • Tech III Pilots
  • PipPipPip
  • 368 сообщений
33
От балды: может быть, у них проблемы с масштабируемостью? Докупить десятки новых, но проверенных временем юнитов проще и дешевле, чем пересобирать весь кластер. К тому же, сервер наверняка на аутсорсинге, а значит, всё более-менее прописано заранее в договоре.
  • 0

#6
Darth Fett

Darth Fett

    Clone Grade Eta

  • Tech III Pilots
  • PipPipPipPip
  • 818 сообщений
209
  • EVE Ingame:Darth Fett
  • Corp:Iris
  • Ally:GE
  • Client:Eng

В данный моент удвоение мощьностей происзходит каждые 8-10 месяцев.

Это каких мощностей? Потребляемых из розетки чтоли? Рабочие частоты процессоров за последние годы практически не изменились, да делают оптимизации выполнения команд, выигрывают какие-то крохи, но основной упор сейчас на многоядерность. А тут затык - все в 1 поток пашет, надо переписывать.
  • 2

#7
DIMFIRE

DIMFIRE

    Кавайчег

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28676 сообщений
2236
  • EVE Ingame:DIMFIRE Dimiana DlMFlRE
  • Client:Eng

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

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

#8
.up

.up

    НЛО

  • Admin
  • 7086 сообщений
2461
  • EVE Ingame:Elnis
  • Corp:OMNYX

Напомните мне пожалуйста, когда ццп последний раз обновляло железо? Год назад? Два?

Несколько месяцев назад.
  • 5
Изображение
Следующее утверждение истинно
Предыдущее утверждение ложно
Добро пожаловать в наш уголок вселенной…

#9
DIMFIRE

DIMFIRE

    Кавайчег

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28676 сообщений
2236
  • EVE Ingame:DIMFIRE Dimiana DlMFlRE
  • Client:Eng
Пруфлинк плиз
  • -5

#10
Turdus

Turdus

    Newbie

  • Tech II Pilots
  • 24 сообщений
19
  • EVE Ingame:TurdusMigratorius Arbosa
  • Corp:Light Style
  • Client:Eng

Пруфлинк плиз

http://www.eveonline.com/devblog.asp?a=blog&bid=885
P.S. Мой первый пост :lol:
  • 3

#11
DarkPhoenix

DarkPhoenix

    Hatred

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28703 сообщений
4393
Димфаер дважды лажает в одном посте :(
  • 1

There is a place where the black stars hang
and the strangest eons call that amorphous mass
unknown, immense, ambivalent to all


#12
reiser

reiser

    Clone Grade Zeta

  • Tech III Pilots
  • PipPipPip
  • 368 сообщений
33
В чём лажа?

Абыдно, конечно, что они так коряво накодили.

Точнее, не коряво, но непродуманно. Интересно, на сколько человек в системе они рассчитывали в 2003 году? Наверное, 100 казалось им фантастикой.
  • 0

#13
Ashtan

Ashtan

    Clone Grade Zeta

  • Tech III Pilots
  • PipPipPip
  • 378 сообщений
94
  • EVE Ingame:Ash2h
  • Corp:TFFN
  • Ally:Solar Fleet
  • Client:Eng

Поправьте меня пожалуйста...

Они просто реализовали Singleton вместо постоянной реинициализации???


Грубо говоря да. Есть понимание, что у них там много славных решений "от студентов первого курса".
  • 2

- Каждый пилот который будет грызть структуры в три ночи получит по собственной луне!
- Извини великий, нас тысяча, готовых неприкоснительно тебе повиноваться, но лун всего сто...
- Это ньюансы парни, главное ВЕРЬТЕ МНЕ!


#14
RLeonis

RLeonis

    Kaoz's modified forum hardener

  • Tech III Pilots
  • PipPipPipPipPipPipPip
  • 5910 сообщений
877
  • EVE Ingame:RLeonis
  • Corp:GoonWaffe
  • Ally:GSF
  • Client:Eng

Про это уже говорилось-главная проблема движка-не более одного ядра на систему. Из за этого и лагает

что за ерунда? )

Грубо говоря да. Есть понимание, что у них там много славных решений "от студентов первого курса".

естественно костылей навалом ) что в принципе норм. для такого масштабного проекта. рефакторят помаленьку =) может через пару лет начнут даже вводить такие штуки как key-value db.

Сообщение отредактировал RLeonis: 17 June 2011 - 1:02

  • 0

28laseh.jpg

 


#15
DIMFIRE

DIMFIRE

    Кавайчег

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28676 сообщений
2236
  • EVE Ingame:DIMFIRE Dimiana DlMFlRE
  • Client:Eng
Скорее всего через пару лет будут вводить имбы за баксы-именно с целью сделать блобы бесполезными
  • -4

#16
DotSlayer

DotSlayer

    Clone Grade Zeta

  • Tech III Pilots
  • PipPipPip
  • 405 сообщений
59
  • EVE Ingame:DotSlayer
  • Corp:OmegaSync

естественно костылей навалом ) что в принципе норм. для такого масштабного проекта. рефакторят помаленьку =) может через пару лет начнут даже вводить такие штуки как key-value db.


а почему ты думаешь, что это им поможет?
  • 0
"Life is like riding an interceptor, to stay alive you must keep moving" A.E., unpublished

#17
Eretic

Eretic

    Легат Возврата

  • Tech III Pilots
  • PipPipPipPipPipPip
  • 5197 сообщений
446
  • EVE Ingame:KB Eretic
  • Client:Eng

Скорее всего через пару лет будут вводить имбы за баксы-именно с целью сделать блобы бесполезными


И тут Остапа понесло...
  • 0
Ересь - иной взгляд на привычные вещи

Не зная ни сна, ни отдыха, при лунном и солнечном свете мы делаем деньги из воздуха, что бы снова пустить их на ветер

Сражение, это странный опыт. Мы планируем действия за счет интеллекта, сражаемся за счет инстинктов, и только потом понимаем, что выжили лишь благодаря случаю.(с)Из письма Фиска Блэка своей сестре Люси.

#18
JesDarkJewel

JesDarkJewel

    Clone Grade Eta

  • Tech III Pilots
  • PipPipPipPip
  • 952 сообщений
52
  • EVE Ingame:JesDarkJewel
  • Corp:Tungus Revolt
  • Channel:Tungus
  • Client:Рус

И тут Остапа понесло...

я бы даже сказал "И даже тут, Остапа понесло..."
  • 0
Один аккаунт - залог долгой и интересной игры.
Ева - игра про взаимоотношения людей.
Он тоже скоро научится летать -> Изображение

#19
DarkPhoenix

DarkPhoenix

    Hatred

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPipPip
  • 28703 сообщений
4393

В чём лажа?

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

а почему ты думаешь, что это им поможет?

На самом деле в случае с ццп они зачастую хранят сущности, которые скорее похожи на объекты, в реляционной бд. Сужу по статик дата дампу. А попытки описать объект, используя то, для чего предназначена реляционная бд (ответов на вопросы) - огромный оверхед и зачастую потеря производительности.

Сообщение отредактировал DarkPhoenix: 17 June 2011 - 8:16

  • 3

There is a place where the black stars hang
and the strangest eons call that amorphous mass
unknown, immense, ambivalent to all


#20
RLeonis

RLeonis

    Kaoz's modified forum hardener

  • Tech III Pilots
  • PipPipPipPipPipPipPip
  • 5910 сообщений
877
  • EVE Ingame:RLeonis
  • Corp:GoonWaffe
  • Ally:GSF
  • Client:Eng
/me смотрит на DarkPhoenix с уважением.

да, сср есть над чем поработать.
  • 0

28laseh.jpg

 





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

0 members, 0 guests, 0 anonymous users