RE:NODE

Minecraft10 мин чтения

Лаги от сущностей в Minecraft: лимиты и ClearLag

Как держать под контролем выпавшие предметы, сферы опыта и скопления сущностей настройками Paper, безопасными командами kill и почему ClearLag - крайняя мера.

0 прочтений

Если сервер лагает из-за слишком большого числа сущностей, решение почти никогда не в плагине, который каждые несколько минут удаляет всё, что лежит на земле. Выпавшие предметы и так исчезают через пять минут (6000 тиков). Paper и Spigot позволяют сильнее их объединять, быстрее удалять мусорные предметы, ограничивать то, что сохраняет чанк, и не давать стрелам и сферам опыта копиться - и всё это без вмешательства в то, что игрок вот-вот подберёт. Найдите, какой тип сущностей растёт, с помощью /paper entity list, исправьте ферму или конструкцию, которая его производит, и оставьте таймеры в духе ClearLag как крайнюю меру для публичных серверов, где невозможно поговорить с каждым строителем. Очистка по таймеру прячет причину и удаляет вещи игроков, а это обходится вам в доверии дороже, чем экономит в тиках.

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

Что считается сущностью и какие из них дорогие#

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

Тип сущностиТикает?Типичная стоимостьОбычный источник избытка
Выпавшие предметыДаНизкая каждая, высокая тысячамиФермы без сбора, смерти, дроп с мобов
Сферы опытаДаНизкая каждаяГриндеры мобов, плавка, разведение
Стрелы и трезубцыДаНизкаяФермы скелетов, PvP, раздатчики
Враждебные и мирные мобыДа, с ИИОт средней до высокойФермы, загоны, спавнеры
Вагонетки и лодкиДаСредняяЗаброшенные железные дороги, транспорт мобов
Стойки для брониДа, по умолчаниюОт низкой до среднейДекор, плагины голограмм
РамкиПочти нетВ основном нагрузка на клиентСтены хранилищ, карты
Падающие блоки и TNTДаВысокая, пока активныФермы песка, TNT-машины

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

Найдите, что на самом деле копится#

Измеряйте, прежде чем что-то настраивать.

code
/paper entity list/paper entity list minecraft:item/paper entity list minecraft:experience_orb/execute if entity @e[type=minecraft:item]

/paper entity list без типа даёт количество по каждому типу сущностей в загруженных чанках; с типом - список чанков, где их больше всего, с координатами. Так «на сервере слишком много сущностей» превращается в «в одном чанке на x: -310, z: 2290 лежит 4100 предметов», а это ферма со сломанной системой сбора и владелец, которому можно написать.

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

Затем подтвердите стоимость профилем. Если spark показывает, что тик сущностей мал по сравнению с загрузкой чанков или плагином, число сущностей - симптом чего-то другого или просто не проблема. Куда смотреть, показано в статье Как читать отчёт spark.

Настройки исчезновения и слияния, которые делают работу#

Большая часть нужной вам очистки сущностей уже встроена в Paper и Spigot. Её просто не настроили.

spigot.yml (world-settings.default)
merge-radius:  item: 2.5  exp: 3.0item-despawn-rate: 6000arrow-despawn-rate: 1200trident-despawn-rate: 1200

Это значения по умолчанию. Что делает каждое и что стоит менять:

  • merge-radius.item определяет, насколько близко должны лежать одинаковые предметы, чтобы объединиться в одну сущность-стопку. Поднятие до 3.5 или 4.0 заметно сокращает число предметов под фермами. Предметы визуально стягиваются друг к другу с чуть большего расстояния, и это никому не мешает.
  • merge-radius.exp делает то же самое для сфер опыта. Современные версии и так объединяют сферы одинакового номинала, поэтому эффект от увеличения меньше, чем раньше, но под гриндерами это всё ещё помогает.
  • item-despawn-rate задаётся в тиках: 6000 - это ванильные пять минут. Снизить его глобально - грубая версия ClearLag, и бьёт она по игроку, чья куча вещей после смерти лежит в двух блоках. Используйте вместо этого настройку для отдельных предметов ниже.
  • arrow-despawn-rate и trident-despawn-rate по умолчанию равны 1200 тикам (одна минута) для снарядов, застрявших в блоках. Снизить для стрел до 300 безвредно, это очищает фермы скелетов и стрельбища. Трезубцы не трогайте: игрок, бросивший трезубец, хочет его вернуть.

Paper добавляет более тонкое управление в config/paper-world-defaults.yml:

config/paper-world-defaults.yml
entities:  spawning:    alt-item-despawn-rate:      enabled: true      items:        cobblestone: 300        netherrack: 300        rotten_flesh: 600        bamboo: 600

alt-item-despawn-rate - правильный инструмент для мусора. Булыжник после похода в шахту и незерак после прокладки туннеля исчезают через пятнадцать секунд вместо пяти минут; всё остальное живёт по ванильному таймеру, так что выпавшая алмазная кирка остаётся нетронутой. Составляйте список по тому, что на самом деле появляется в /paper entity list minecraft:item на вашем сервере, а не копируйте чужой - мусор фермерского сервера отличается от мусора шахтёрского.

Другие настройки Paper в том же файле, о которых стоит знать:

  • entities.spawning.non-player-arrow-despawn-rate и creative-arrow-despawn-rate ускоряют исчезновение стрел от скелетов, раздатчиков и игроков в творческом режиме. Обе по умолчанию равны default, то есть берут значение из Spigot.
  • entities.armor-stands.tick: true определяет, тикают ли стойки для брони. Значение false экономит работу на серверах с тысячами декоративных стоек; оно ломает стойки, которым нужна физика или которые двигает плагин, так что сначала проверьте.
  • entities.armor-stands.do-collision-entity-lookups: true можно выставить в false, чтобы стойки не проверяли коллизии, - небольшая экономия на серверах с обилием декора.
  • entities.spawning.despawn-ranges задаёт мягкую и жёсткую дистанции исчезновения мобов, от которых зависит, как быстро ненужные мобы пропадают, когда игроки уходят.

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

Лимиты сохранения на чанк: защита от бомб из сущностей#

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

config/paper-world-defaults.yml
chunks:  entity-per-chunk-save-limit:    arrow: 100    experience_orb: 100    snowball: 50    ender_pearl: 20    fireball: 20    small_fireball: 20

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

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

Ручная очистка, которая никому не вредит#

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

code
/kill @e[type=minecraft:item,distance=..64]/kill @e[type=minecraft:experience_orb]/kill @e[type=minecraft:arrow]/kill @e[type=minecraft:item,nbt={Item:{id:"minecraft:cobblestone"}}]/kill @e[type=minecraft:zombie,distance=..100]

Команды с ограничением по области запускайте с нужного места - встаньте там в игре или оберните их в /execute positioned <x> <y> <z> run ... из консоли. Фильтр distance=..64 означает «в пределах 64 блоков от места выполнения команды»; из консоли без позиции расстояние отсчитывается от точки спавна мира, а это редко то, что нужно. Фильтр NBT для предметов зависит от версии (в 1.20.5 NBT предметов сменился на компоненты), поэтому сначала проверьте его на одном предмете.

Предупредите игроков заранее. Сообщение в чате и минута ожидания ничего не стоят и спасают того единственного человека, чья куча вещей после смерти оказалась в радиусе. Префикс /minecraft: стоит использовать, если плагины подменяют /kill своей версией.

ClearLag и очистка по таймеру#

ClearLag - самый известный плагин для удаления сущностей. Он работает по таймеру, рассылает предупреждения, удаляет настроенные типы сущностей и предлагает команды вроде /lagg clear для немедленного удаления сущностей, /lagg check для подсчёта и /lagg killmobs для удаления мобов. Он существует давно, и разработка шла с перерывами, поэтому прежде чем на него полагаться, проверьте, что скачанная сборка поддерживает вашу версию Minecraft.

Что он делает хорошо:

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

Что он делает плохо:

  • Он убирает симптом. Ферма продолжает производить; плагин продолжает удалять. Стоимость производства предметов в тиках никуда не девается.
  • Он удаляет вещи. Кучи после смерти, предметы, выложенные для обмена, шалкер, который кто-то поставил на секунду. Обратный отсчёт помогает, но не игроку, который в этот момент отошёл.
  • Он поощряет плохие постройки. Если землю очищают каждые пять минут, никому не нужно строить системы сбора, и их не строят.
  • Функции, которые звучат полезно, часто таковыми не являются. Всё, что рекламируется как освобождение памяти через вызов сборщика мусора Java, на современной JVM ничего полезного не делает и может вызвать паузу. Память и число сущностей - разные проблемы; см. статью Сколько RAM нужно серверу Minecraft.

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

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

Исправление источника#

За каждой проблемой с сущностями стоит строитель. Исправления редко бывают сложными.

  1. Сбор под каждой фермой. Водяные потоки к нескольким воронкам или линия воронок, ведущие в хранилище. Ферма, которая сбрасывает добычу на землю, не закончена.
  2. Обработка переполнения. Когда хранилище заполняется, предметы скапливаются и вываливаются. Строители должны добавить переполнение, которое либо останавливает ферму, либо уничтожает излишек в мусорке из лавы или кактуса - намеренная утилизация дешевле кучи.
  3. Камеры убийства, которые убивают. Гриндер, оставляющий мобов живыми в зоне ожидания, - это загон с ИИ. Убивайте быстро, собирайте сразу.
  4. Никакого неиспользуемого транспорта. Заброшенные цепочки вагонеток и лодки с мобами продолжают тикать. Убирайте их, когда проект закончен.
  5. Декор в меру. Хранилище с тремя сотнями рамок - проблема с FPS на клиенте у каждого, кто туда заходит, даже если серверу всё равно.

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

На RE:NODE команды подсчёта и безопасные формы /kill можно запускать прямо из консоли панели, с нефильтрованным выводом, а потом смотреть, как успокаиваются графики памяти и CPU. Перед любой массовой очисткой сделайте backup из панели - это одна кнопка, копия хранится вне машины, и опечатка в селекторе - ровно тот случай, для которого он нужен. Почему один из backup стоит проверить, объясняет статья Backup, которые действительно восстанавливаются.

FAQ#

Сколько живут выпавшие предметы в Minecraft?

Пять минут, то есть 6000 тиков, если это не изменено через item-despawn-rate в spigot.yml или через alt-item-despawn-rate в Paper для отдельных предметов. Предметы в выгруженных чанках не стареют, поэтому куча в чанке, который никто не посещает, ждёт, пока кто-нибудь придёт.

ClearLag вредит серверу?

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

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

/kill @e[type=minecraft:item], желательно с ограничением по расстоянию и после предупреждения. Никогда не используйте /kill @e без фильтра по типу, потому что так удаляются ещё и игроки, питомцы, жители, рамки и стойки для брони.

Вызывают ли лаги рамки и стойки для брони?

Стойки для брони по умолчанию тикают и стоят понемногу каждая; Paper может это отключить. Рамки почти не тикают, но нагружают клиент и сеть, поэтому комната, полная рамок, бьёт по FPS игроков сильнее, чем по тику сервера.

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

Загружается чанк с огромным количеством сущностей - часто это предметы или сферы опыта, накопившиеся под фермой. Проверьте /paper entity list, пока игрок там, затем задайте entity-per-chunk-save-limit для снарядов и сфер опыта и исправьте сбор на ферме.


Комментарии

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

0/2000