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

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

Чиним лаги: дрейки судьбы (часть 2)


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

#1
Tester128

Tester128

    scourge heavy missile

  • Tech III Pilots
  • PipPipPipPipPip
  • 2898 сообщений
1080
  • EVE Ingame:tester128
  • Corp:-FRS-
  • Ally:.-D-.
  • Client:Eng
Чиним лаги: дрейки судьбы (часть 2)
by CCP Masterplan | 2010.12.11 15:18:59
оригинал

В предыдущей серии...

В первой части блога я рассказывал что такое Destiny и как утилита Telemetry помогает оптимизировать работу сервера. В конце я указал на обнаруженную в ходе оптимизации проблему – злые плюющиеся ракетами дрейки, вызывающие чрезмерную нагрузку на Destiny.

Теперь я покажу как мне удалось решить эту проблему.

Начнем с конца, я сразу продемонстрирую результаты. На рис. 1 показано распределение вычислительной нагрузки в течении 100 секунд непрерывного спама ракет (тестовая кинфигурация описана в первой части). Слева показано как распределялось процессорное время при использовании старого кода, годами работавшего на основном сервере. Справа покаана работа нового оптимизированного кода, вышедшего в составе Incursion.

Изображение
Рис. 1 : Загрузка процессора в течении 100 секунд – до и после оптимизации

Очевидно, что нагрузка на Destiny заметно уменьшилась. Теперь самыми времязатратными стали фазы инвентаризации (учета объектов) и рассчета повреждений – и у нас уже есть наработки по оптимизации этих фаз, но о них мы поговорим в другой раз.

Итак, что же произошло?

Осторожно: псевдокод прямо по курсу!

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

В очень упрощенном виде алгоритм выглядел следующим образом:

1 для каждого наблюдателя: # (корабль игрока)

2   для каждого шара в одном пузыре с наблюдателем:

3	 если шар добавлен\удален во время последнего тика:

4	   собрать все даные об этом шаре, которые надо переслать на клиент наблюдателя

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

Первая оптимизация кода заключалась в кэшировании данных шага 4. Она особенно хорошо себя показывает в случае подварпа флота, но полезна и для стационарных боев. Но она не избавляет нас от мерзкого отвратительного вложенного цикла.

Вторая оптимизация заключалась в рефакторинге самого алгоритма. Тут я бы хотел упомянуть о еще одной вещи, которую часто поминают в обсуждении на форумах. Почему вы используете Питон? Питон медленный. Если бы вы все перевели на C++ то все лаги бы сразу пропали. В данном случае я вынужден не согласиться. Обсуждаемая нами функция отжирала во время масс-тестов более 15% процессорного времени. И она полностью написана на C++. Хорошая иллюстрация того, что кривой алгоритм будет тормозить на любом языке. Для небольшого числа шаров и наблюдателей этот алгоритм прекрасно работает. Но при увеличении этих чисел, масштабируется он плохо.

Новая оптимизированная версия теперь выглядит так (тоже упрощенно):

1 для каждого пузыря:

2  создатиь список добавлений/удалений:

3	для каждого шара в пузыре:

4	  если шар добавлен/удален в этом тике:

5		собрать все данные об этом шаре, необходимые для передачи клиенту и сохранить в списке

6 для каждого наблюдателя: # (корабль игрока)

7   сохранить индекс в списке из шага 2, учитывая текущий пузырь наблюдателя

Этот алгоритм масштабируется как (N+M).

Следующая проблема, которую я обнаружил – избыточные действия при сериализации обновлений данных для клиентов. Ее решение было из серии откровений приходящих в ванной, но появиться оно могло только после того как мы реализовали две описанные выше вещи. Большинство клиентов в одном пузыре будут получать сериализованные обновления данных с одинаковым содержанием. Так что мы можем отказаться от отдельной сериализации для каждого клиента и после завершения шага 5 сериализовать одно общее обновление и разослать его всем клиентам в этом пузыре. Раньше мы делали операцию сериализации (преобразования внутренних структур данных на сервере в потоковый формат, пригодный для пересылки по сети), для каждого клиента. Теперь мы делаем операцию сериализации только для каждого пузыря (грида) и по одной команде memcpy для каждого наблюдателя. (Это объяснение сильно упрощено и не покрывает некоторые ситуации, но в целом оно верно).

Долина офигенностей

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

Изображение
Рис. 2: Загрузка процессора во время стрельбы ракетами при включенной и отключенной оптимизации

Ракеты начинаю лететь в 15:21 и заканчиваются в 15:27.

Вначале оптимизация отключена. В 15:23, я ее включаю (загрузка падает). В 15:25 опять отключаю (загрузка опять увеличивается)

Для сравнения, вот результаты работы профайлера Telemetry с включенной и выключенной оптимизацией:

Изображение
Рис. 3: Сравнение двух тиков Destiny с и без оптимизации (одинаковая временная шкала)

Снимок тика сверху сделан до 15:23, снизу – сразу после 15:23.

Установка

Эти оптимизации алгоритма работали на тестовом сервере в октябре и ноябре. Если вы были на одном из массовых тестов в это время, то наверняка помните как были организованы флитовые варпы, кемпы и стрельба по посам. Это делалось специально чтобы испытать работу этого кода. Мы убедились что мои экспериментальные результаты, полученные с тонкими клиентами работают в реальных условиях с реальными игроками.

Работа с новой моделью сериализации была включена в Incursion 1.0.0 и вышла 30 ноября. 1 декабря я активировал новый код Destiny на части нод Tranquillity и понаблюдал за работой соответствующих солнечных систем. Когда мы убедились что все работает правильно, код был активирован для всего сервера. Это произошло во время даунтайма 2 декабря.

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

=====

=====

Сообщение отредактировал Tester128: 12 December 2010 - 5:26

  • 7

Изображение


Дс Дс дс...да что это вообще такое? ну летает какая-то шайка. шайка шайкой, профессиональные ногебаторы...не более...

Вааб бааб дааб тааб. Трололо!


#2
mypuk

mypuk

    Clone Grade Kappa

  • Tech III Pilots
  • PipPipPipPipPip
  • 2589 сообщений
417
  • EVE Ingame:Kuroi hagane
  • Corp:SOERI
  • Ally:RA
  • Client:Eng
оперативно. спасибо
  • 0

#3
Chegevarich

Chegevarich

    Clone Grade Iota

  • Tech III Pilots
  • PipPipPipPipPip
  • 1551 сообщений
570
  • EVE Ingame:iChegevarich
  • Client:Eng

Рис. 1 : Загрузка процессора в течении 1000 секунд – до и после оптимизации


Стоит поправить на 100 секунд <_<
Спасибо за перевод
  • 0

#4
Belfigor

Belfigor

    Clone Grade Eta

  • Tech III Pilots
  • PipPipPipPip
  • 546 сообщений
-45
  • Channel:Chibi Cartel Recruiting
  • Client:Eng
Надеюсь дрейки наконец понерфят :о
  • 0

4sirh1.jpg


#5
Takeshi Ryuu

Takeshi Ryuu

    Clone Grade Eta

  • Tech III Pilots
  • PipPipPipPip
  • 696 сообщений
361
  • EVE Ingame:Takeshi Ryuu
  • Corp:IRR
  • Client:Eng
Дрейки уже пофиксили/понерфили =), так как оказывается, что новый "быстрый" код на сервере уже со 2 декабря работает.
  • 0

#6
Карбофос

Карбофос

    Clone Grade Kappa

  • Tech III Pilots
  • PipPipPipPipPip
  • 2163 сообщений
255
  • EVE Ingame:TURAH
  • Corp:npc
  • Client:Eng
А как это скажется на дрейках, почему нерф?

Сообщение отредактировал Карбофос: 11 December 2010 - 20:06

  • 0

#7
Sergio Berg

Sergio Berg

    Clone Grade Alpha

  • Tech II Pilots
  • Pip
  • 48 сообщений
0
  • EVE Ingame:Sergio Berg
  • Corp:-
  • Ally:-
  • Client:Eng
Скорее это буст дрейков, теперь можно в 1,5 раза больше дрейков брать в бой, при этом лагать будет как раньше.
  • 0

#8
Морес

Морес

    Clone Grade Theta

  • Tech III Pilots
  • PipPipPipPip
  • 1240 сообщений
186
  • EVE Ingame:Морес
  • Client:Eng
Старый алгоритм масштабируется как N*M,новый как N+M.
Математика говорит нам,что если 0<N+M<3 => N*M<N+M=>они нерфят солопвп и смол ганги!!!111
  • 1



#9
Tester128

Tester128

    scourge heavy missile

  • Tech III Pilots
  • PipPipPipPipPip
  • 2898 сообщений
1080
  • EVE Ingame:tester128
  • Corp:-FRS-
  • Ally:.-D-.
  • Client:Eng

Старый алгоритм масштабируется как N*M,новый как N+M.
Математика говорит нам,что если 0<N+M<3 => N*M<N+M=>они нерфят солопвп и смол ганги!!!111


блог говорит что при малых н и м старый алгорим работал вполне нормально, проблемы полезли при увеличении, что вполне логично
мне что то вспоминаются старые бояны про алгоритмы сортировки и как у них время работы масштабируется с размером массива
  • 0

Изображение


Дс Дс дс...да что это вообще такое? ну летает какая-то шайка. шайка шайкой, профессиональные ногебаторы...не более...

Вааб бааб дааб тааб. Трололо!


#10
hotspot

hotspot

    Clone Grade Delta

  • Tech III Pilots
  • PipPip
  • 146 сообщений
5
  • EVE Ingame:hotspot040471
  • Corp:DCM
  • Client:Eng
На последнем масс тесте пару дней назад ,в котором мне довелось поучаствовать.При локале в 500(не самый большой) рыл и массовом варпе на объекты,стрельбе по друг другу,джампах и тд. у всего стада было максимум 1 фпс правда дрейков там небыло ни одного.Потом у многих повисли компы и они вышли из игры.
ИМХО очередная телега от ЦЦП мол мы делали старались и оннаночо получилось.Хотя на самом деле я лично сомневаюсь что им что то удалось сделать в этом направлении - как лагало так и лагает!Людям ненужны ваши графики и куча текста в котором вы описываете как вы неустанно боретесь с лагами им нужен результат,которого как не печально нет.
  • 0
Жесткий выброс в реальность - это отключенный интернет.

#11
diniaprapor

diniaprapor

    Clone Grade Lambda

  • Tech III Pilots
  • PipPipPipPipPipPip
  • 4263 сообщений
2610
  • EVE Ingame:Occam Razr
  • Corp:Burundukai Inc.
  • Client:Eng

. у всего стада было максимум 1 фпс правда дрейков там небыло ни одного.Потом у многих повисли компы и они вышли из игры.
ИМХО очередная телега от ЦЦП мол мы делали старались и оннаночо получилось.Хотя на самом деле я лично сомневаюсь что им что то удалось сделать в этом направлении - как лагало так и лагает!Людям ненужны ваши графики и куча текста в котором вы описываете как вы неустанно боретесь с лагами им нужен результат,которого как не печально нет.


Ты осознаешь разницу между лагом твоего компа и лагом сервера?

И девблоги таки нужны, потому что иначе ты первым бы побежал на форум плакать о том что ЦЦП не делают вообще ничего.
  • 0
This is my signature. There are many others like it, but this one is mine.

Someday, this signature may save my life.

#12
NAFTAN

NAFTAN

    Clone Grade Delta

  • Tech III Pilots
  • PipPip
  • 121 сообщений
18
  • EVE Ingame:NAFTAN
  • EVE Alt:много
  • Corp:RSBG
  • Ally:WW
  • Client:Eng

Следующая проблема, которую я обнаружил – избыточные действия при......

Вот это огромная тима в 1 человека которая бориться с лагами в еве....
Апдейт: забыл про ещё одного который бориться с лагами при пропрыге =))
  • 0
Всё, что написано мной это ИМХО и только ИМХО.

Задачи: купить вражеских ФК, подпалить слободку с трех сторон, закатать в асфальт, нафармить алоев на титан каждому мемберу, потроллить на форумах и забрать весь технеций (о-ло-ло) (с) Мой император
Изображение

#13
Atmega

Atmega

    Clone Grade Ksi

  • Tech III Pilots
  • PipPipPipPipPipPipPipPipPip
  • 10365 сообщений
2123
  • EVE Ingame:Atmega
  • Corp:MEN
  • Client:Eng
Имхо доходчиво разжеванный буст блобов. Спасибо CCP (30-40% производительности это весомо) и переводчику.
  • 0

We don't need to get a life, we gamers have many lifes.

Time you enjoy wasting, was not wasted.


#14
Irridis

Irridis

    Clone Grade Gamma

  • Tech III Pilots
  • PipPip
  • 113 сообщений
-9
  • EVE Ingame:Bolshakov Alexei
  • Corp:Siberian Alpha Fleet
  • Client:Рус
Вот оказывается почему Калдырей все время нерфят! Чтобы ракетами никто не пользовался! Гады! За державу обидно блин :)
  • 0
Перед законом все равны, но кто-то равнее...

#15
pribalt

pribalt

    Clone Grade Beta

  • Tech III Pilots
  • Pip
  • 72 сообщений
-21
  • EVE Ingame:ParagonFree
  • Corp:RGSU
  • Ally:GSF
  • Client:Рус
Спасибо за перевод
  • 0

#16
miragus

miragus

    Clone Grade Delta

  • Tech III Pilots
  • PipPip
  • 207 сообщений
4
  • Corp:Butthurt Delivery
  • Ally:-
  • Channel:local
  • Client:Рус
спасибо за перевод! было интересно прочесть.
  • 0

#17
Doppelori

Doppelori

    It's 12 o'clock

  • Tech III Pilots
  • PipPipPipPipPipPip
  • 4244 сообщений
540
  • EVE Ingame:Okuu Reiuji
  • Corp:Petooshki Сосаети
  • Client:Eng
Нерф NC, лол.
  • 0

#18
thiscall

thiscall

    Clone Grade Epsilon

  • Tech III Pilots
  • PipPipPip
  • 301 сообщений
0
  • EVE Ingame:OutCast EG
  • Corp:BLYA
  • Ally:x.i.x
  • Client:Eng
1: для каждого пузыря:

2:   создать список добавлений/удалений:

3:   для каждого шара в пузыре:

4:	 если шар добавлен/удален в этом тике:

5:	   собрать все данные об этом шаре, необходимые для передачи клиенту и сохранить в списке

6: для каждого наблюдателя: # (корабль игрока)

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

На последнем масс тесте пару дней назад на тестсервере <...>

еще вопросы?
В последнем масстест на сиси набилось 1000 тел по графику. Хорошо что не упало вообще.
  • 1

#19
Black Archer

Black Archer

    Clone Grade Beta

  • Tech III Pilots
  • Pip
  • 71 сообщений
1
  • Client:Eng
За перевод спасибо!
  • 0
Изображение

#20
Caliber .50

Caliber .50

    Clone Grade Iota

  • Tech III Pilots
  • PipPipPipPipPip
  • 1912 сообщений
599
  • Client:Eng
На таких девблогах большему можно научиться, чем в некоторых высших учебных заведениях.
Спасибо переводчику, CCP. Посмотрим, как скоро "эпичные сражения между тысячами игроков" станут реально эпичными, а не игрой в карты для слепых и глухих.
  • 0




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

0 members, 0 guests, 0 anonymous users