RE:NODE

Minecraft11 мин чтения

Лаги от редстоуна в Minecraft: часы и воронки

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

0 прочтений

Редстоун редко бывает причиной лагов на обычном survival-сервере и почти всегда - на техническом. Затраты конкретны и предсказуемы: воронки, проверяющие предметы каждый тик, часы, которые никогда не останавливаются, поршни, которые двигают блоки и запускают пересчёт освещения и обновления соседей, и длинные линии редстоун-пыли, обновляющие тысячи позиций за один импульс. На Paper худшее можно удешевить с помощью misc.redstone-implementation: alternate-current, настроек воронок в spigot.yml и paper-world-defaults.yml и ванильного ограничения max-chained-neighbor-updates. Дальше всё сводится к тому, чтобы найти тот самый механизм, который стоит десять миллисекунд за тик, и иметь правила, позволяющие выключить его без скандала.

Это руководство о том, что редстоун делает с тиком и как его контролировать. Общая настройка Paper описана в статье Оптимизация Paper, а фермерская сторона - жители и мобы - в статье Лаги от жителей и мобоферм.

Во что на самом деле обходится редстоун#

Полезно разделить редстоун на части, которые что-то стоят, потому что исправляются они по-разному.

КомпонентПочему стоит ресурсовЗависит от
Редстоун-пыльКаждое изменение уведомляет соседей, а те - своихДлины линий пыли, частоты импульсов
ВоронкиКаждая по таймеру проверяет, что забрать и что передатьЧисла воронок и того, простаивают ли они
ПоршниДвижущиеся блоки становятся блочными сущностями и вызывают обновления света и формыЧисла блоков, сдвигаемых за импульс
НаблюдателиСрабатывают на каждое замеченное изменение блокаСкорости часов, цепочек наблюдателей
КомпараторыСчитывают содержимое контейнеровЧисла отслеживаемых контейнеров, частоты обновлений
Лампы и освещениеПересчёт света при переключенииЧисла одновременно переключающихся
Сущности предметовДроп на земле или в водяных потокахВыхода ферм без сбора

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

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

Воронки: самый большой рычаг#

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

spigot.yml (world-settings.default)
ticks-per:  hopper-transfer: 8  hopper-check: 1hopper-amount: 1

hopper-transfer - ванильная задержка в восемь тиков между перемещениями. hopper-check - то, как часто простаивающая воронка ищет работу; при 1 она смотрит каждый тик. Поднять hopper-check до 8 - один из самых больших выигрышей, доступных на сервере с большим количеством воронок. Цена - чуть более ленивый подбор: предмет, упавший на простаивающую воронку, может подождать несколько тиков, прежде чем его заберут, и почти никакая конструкция этого не замечает.

hopper-amount - сколько предметов перемещается за одну передачу. Увеличение делает воронки быстрее ванильных, что ломает сортировщики предметов и схемы синхронизации, рассчитанные на ванильную скорость. Оставьте 1, если только вы не меняете игровую механику сознательно.

Paper добавляет ещё три настройки в config/paper-world-defaults.yml:

config/paper-world-defaults.yml
hopper:  cooldown-when-full: true  disable-move-event: false  ignore-occluding-blocks: false

Это значения по умолчанию, и у каждого есть подвох:

  • cooldown-when-full: true отправляет заполненную воронку на перезарядку вместо повторных попыток каждый тик. Оставьте включённым.
  • disable-move-event: true пропускает событие Bukkit о перемещении в инвентаре для передач воронками. При большом количестве воронок это огромная экономия, и это ломает каждый плагин, который слушает это событие: некоторые плагины защиты используют его, чтобы воронки не воровали из запертых сундуков, некоторые плагины логирования - чтобы записывать передачи, а некоторые плагины магазинов на него опираются. Изучите свой список плагинов, прежде чем включать, и проверьте именно ваш плагин защиты.
  • ignore-occluding-blocks: true запрещает воронкам искать контейнеры с предметами сквозь сплошные блоки над ними. Небольшая экономия со странными пограничными случаями; большинство серверов это не трогают.

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

Часы, наблюдатели и то, что никогда не останавливается#

Редстоун-часы производят импульсы бесконечно. Часы на наблюдателях (два наблюдателя, смотрящие друг на друга) дают импульс каждые два игровых тика; часы на компараторах и воронках работают медленнее. Стоимость зависит от того, что делает каждый импульс: часы, управляющие одной лампой, дешёвые, а часы, управляющие батареей поршней, толкающих песок, - нет.

Проблема не в самих часах. Она в часах, которые оставили работать, когда тем, чем они управляют, никто не пользуется. Ферма сахарного тростника, срабатывающая раз в две минуты, почти ничего не стоит; ферма на часах из наблюдателей, срабатывающая каждые два тика, стоит немного за импульс - шестьдесят тысяч раз в час.

Что стоит не поощрять или запретить:

  • Часы без выключателя. У любых часов должен быть рычаг или блокировка. «Часы с выключателем» - разумное правило сервера.
  • Часы на наблюдателях, управляющие поршнями. Быстрое непрерывное движение поршней несколько раз в секунду вызывает обновления блоков, пересчёт освещения и движущиеся блочные сущности.
  • Лаг-машины. Механизмы, построенные специально для того, чтобы вызывать обновления: огромные массивы поршней, быстрый TNT, детекторы обновления блоков в циклах. На публичном сервере это гриферство, и относиться к нему нужно соответственно.

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

Настройка реализации редстоуна#

Ванильная редстоун-пыль обновляет соседей в таком порядке, что получается много лишних обновлений. Длинная линия пыли может вызвать десятки тысяч обновлений блоков на одно изменение состояния. Paper предлагает альтернативные алгоритмы:

config/paper-world-defaults.yml
misc:  redstone-implementation: vanilla
ЗначениеЧто этоКогда использовать
vanillaСобственное поведение пыли в игреПуристы, серверы с очень точными техническими постройками
eigencraftБолее старый оптимизированный алгоритм пылиВ основном вытеснен
alternate-currentПереписанный алгоритм пыли с гораздо меньшим числом лишних обновленийПочти любой сервер с заметным количеством редстоуна

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

В server.properties есть и ванильное защитное ограничение:

server.properties
max-chained-neighbor-updates=1000000

Оно ограничивает, сколько цепочечных обновлений соседей может произойти за раз, прежде чем остальные будут пропущены. Оно нужно, чтобы механизм не заморозил сервер бесконечным каскадом. Снижение защищает от лаг-машин ценой риска сломать очень большие законные постройки; большинство серверов может оставить значение по умолчанию, а сервер, который атаковали машинами каскадных обновлений, может снизить его, проверить и подстроить. Все остальные ключи этого файла разобраны в статье server.properties: подробный разбор.

Поршни, дюп и настройки эксплойтов в Paper#

Поршни - место, где производительность пересекается с честностью игры. Ванилла допускает несколько трюков с дюпом - дублирование TNT, ковров и рельсов через поршни, - которыми технические игроки пользуются в туннельных бурах на TNT и пожирателях мира. Paper по умолчанию их отключает, в разделе, название которого специально вас предупреждает:

config/paper-global.yml
unsupported-settings:  allow-headless-pistons: false  allow-piston-duplication: false  allow-permanent-block-break-exploits: false

allow-piston-duplication: true возвращает дюп TNT, ковров и рельсов. Это прежде всего игровое решение: дюперы TNT делают возможными карьеры до уровня бедрока и пожиратели мира, а заодно позволяют с лёгкостью сровнять с землёй чужие постройки, если ваш плагин защиты не останавливает взрывы. Это ещё и решение о производительности: работающий на часах дюпер TNT непрерывно создаёт взрывы, падающие блоки и сущности предметов. Если включаете, требуйте выключать дюперы, когда рядом никого нет, и держать их внутри приватов.

allow-headless-pistons и allow-permanent-block-break-exploits снова разрешают ломать бедрок и рамки портала в Энд. На survival-сервере с границей мира и правилом о крыше Нижнего мира оставьте их выключенными.

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

Как найти механизм, стоящий за скачком#

Когда /mspt подскакивает, вам нужно место, а не теория.

code
/spark profiler start --only-ticks-over 100/spark profiler stop/paper chunkinfo/paper entity list

--only-ticks-over 100 записывает только тики дольше 100 мс, что отделяет скачки от обычного фона. В отчёте ищите под тиком мира тик блочных сущностей (здесь видны воронки), обновления блоков и обновления соседей (пыль и наблюдатели), а также движение поршней. Разбор представлений есть в статье Как читать отчёт spark.

spark говорит, какого рода работа, но не где. Чтобы найти место:

  1. Посмотрите, кто в сети во время скачка. Лаг, который следует за игроком, - это его база или его ферма. Снимите профиль spark, когда рядом находится только этот игрок.
  2. С помощью /paper chunkinfo посмотрите, сколько чанков и блочных сущностей загружено в каждом мире, и сравните с этим игроком в сети и без него.
  3. Пролетите над районом. Часы слышно - постоянные звуки поршней и наблюдателей их выдают.
  4. Если у вас есть плагин логирования блоков, посмотрите, кто недавно ставил в этом районе наблюдатели, поршни и воронки. //count из WorldEdit по выделенной области даёт число воронок или наблюдателей в постройке.

Лимиты и правила, которые держат всё под контролем#

Техническому серверу и обычному survival-серверу нужны разные правила, но обоим нужны записанные.

Для обычного survival-сервера:

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

Для технического сервера задайте лимиты в числах, вокруг которых можно проектировать: бюджет воронок на базу, правило, что пожиратели мира и дюперы TNT работают только в присутствии владельца, и опубликованные simulation-distance и реализацию редстоуна. Технические игроки обычно спокойно относятся к лимитам, которые видят заранее; они возражают против лимитов, о которых узнают, когда у них ломается постройка.

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

Если на сервере доминирует одна техническая база, есть структурное решение: вынести техническую игру на отдельный сервер или в отдельный мир с собственными настройками. Переопределения для отдельного мира - <world>/paper-world.yml и world-settings.<name> в spigot.yml - позволяют творческому или тестовому миру жить по более мягким правилам, чем мир выживания. Полноценная схема из нескольких серверов описана в статье Сеть серверов за прокси Velocity.

На RE:NODE консоль панели принимает /spark и /mspt с историей и автодополнением по Tab, так что можно снять профиль и прочитать результат, не уходя со страницы, а график CPU показывает скачок относительно лимита вашего тарифа. CPU жёстко ограничивается купленной долей: сервер на 100% работает медленно, но не сломан, и за это его никогда не приостанавливают. Если один механизм способен загрузить его до предела, ответ - настройки и правила выше, а уже потом тариф побольше.

FAQ#

Безопасно ли включать Alternate Current в существующем мире?

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

Почему сервер лагает, когда заходит один игрок?

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

Лагают ли воронки, даже когда они пустые?

Да, это главная причина, почему они дорогие. Простаивающая воронка всё равно проверяет, нет ли предметов, которые можно забрать. Если поднять hopper-check в spigot.yml, простаивающие воронки будут проверять реже, и эта стоимость резко упадёт.

Стоит ли полностью запретить редстоун-часы?

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

Можно ли разрешить дюп TNT на Paper?

Да, через unsupported-settings.allow-piston-duplication: true в paper-global.yml. Относитесь к этому как к решению об игровом процессе и гриферстве, а не только о производительности, и убедитесь, что плагин защиты останавливает взрывы в приватах других игроков.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000