RE:NODE

Minecraft13 мин чтения

Оптимизация Minecraft Paper: конфиги, которые чинят TPS

Какой конфиг Paper за что отвечает и какие настройки реально поднимают TPS: дальность прорисовки и симуляции, спавн мобов, activation range, хопперы и чанки.

0 прочтений

Значения по умолчанию в Paper хороши. Это первое, что нужно понять, прежде чем вставлять в сервер чьи-то «оптимизированные конфиги»: стандартные значения выбрали люди, которые профилируют Minecraft профессионально, а большинство ходящих по сети наборов конфигов отстали на три версии и меняют нужное вам поведение на время тика, которое вам не нужно. Настоящих крупных выигрышей мало, и почти все они связаны с расстоянием: как далеко сервер отправляет чанки, как далеко он их тикает и сколько мобов держит живыми внутри этого радиуса.

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

Пять файлов и кто чем владеет#

Сервер Paper - это Bukkit внутри Spigot внутри Paper, и каждый слой сохранил собственную конфигурацию. Загружаются они в таком порядке, так что при пересечении побеждает более поздний файл.

ФайлЗа что отвечает
server.propertiesНастройки vanilla: view distance, simulation distance, максимум игроков
bukkit.ymlЛимиты спавна мобов и частота спавна, сборка мусора чанков, автосохранение
spigot.ymlActivation range и tracking range сущностей, хопперы, радиус слияния, скорость despawn
config/paper-global.ymlОбщие настройки Paper для сервера: скорость отправки чанков, прокси, лимиты пакетов
config/paper-world-defaults.ymlНастройки Paper для каждого мира, применяемые ко всем мирам

Любой мир может переопределить значения Paper по умолчанию собственным <world>/paper-world.yml, а в spigot.yml та же идея выражена как world-settings.<name> рядом с world-settings.default. Используйте это, когда Незеру нужны другие числа, чем Верхнему миру, - обычно не нужны.

Два предупреждения о руководствах, включая это. Paper переносит и переименовывает ключи между версиями: единый paper.yml превратился в папку config/ в эпоху 1.19, и отдельные настройки сдвигались и после. Всегда открывайте файл, который создал ваш собственный сервер, и ищите в нём ключ, а не вставляйте готовый блок. А unsupported-settings в paper-global.yml называется так не зря; в этом руководстве оно не затрагивается.

Если вы ещё не читали все ключи server.properties, начните с него, потому что два из трёх крупнейших рычагов лежат в том файле, а не в файлах Paper.

View distance и simulation distance#

Это и есть вся игра. Всё остальное в этом руководстве стоит нескольких процентов; эти два дают кратный выигрыш.

server.properties
view-distance=8simulation-distance=6

View distance - это на сколько чанков от каждого игрока сервер загружает, держит в памяти и отправляет по сети. Площадь растёт квадратично, поэтому стоимость не линейна по числу: снижение с 10 до 8 убирает около трети загруженных чанков на игрока, а с 10 до 6 - почти две трети. На сервере с двадцатью людьми, разбросанными по карте, это разница между 8400 загруженными чанками и 3000.

Simulation distance, выделенная из view distance в 1.18, - это то, как далеко чанки реально тикают: ИИ мобов, рост посевов, редстоун, хопперы, печи, течение воды. Её дешевле уменьшать из двух, потому что игроки не видят, как это происходит. Цена - фермы: всё, что находится за пределами simulation distance каждого игрока онлайн, перестаёт работать, так что AFK-ферма рыбы при simulation-distance=4 сломается так, что игроки назовут это багом.

Разумные пары в зависимости от загруженности сервера:

  • Тихий сервер, меньше десяти игроков: view-distance=10, simulation-distance=8. Оставьте значения по умолчанию.
  • Обычный SMP, от десяти до двадцати пяти игроков: view-distance=8, simulation-distance=6.
  • Загруженный сервер, тридцать и больше: view-distance=6, simulation-distance=5. Ниже этого туман и появление объектов из ниоткуда начинают выглядеть сломанными.
  • Сервер мини-игр или лобби: view-distance=5 или ниже, simulation-distance=4. В лобби никто не фармит.

Paper может переопределять оба значения для каждого мира в spigot.yml, где view-distance и simulation-distance из коробки принимают значение default. Лобби-мир со значением 4 и мир выживания со значением 8 на одном сервере - законная и действенная схема.

Одна связанная настройка: entity-broadcast-range-percentage в server.properties, по умолчанию 100. Она масштабирует, как далеко сущности отправляются клиентам, в процентах от view distance. Если снизить её до 75, на многолюдном сервере заметно падает трафик пакетов сущностей ценой того, что мобы и выброшенные предметы появляются позже при приближении. Это выигрыш скорее по трафику и на стороне клиента, чем по времени тика.

Спавн мобов - это почти всё остальное#

После расстояния тики уходят на мобов. Сервер Minecraft тратит большую долю каждого тика на решение, спавнить ли что-то, а затем на поиск пути для заспавненного.

bukkit.yml
spawn-limits:  monsters: 70  animals: 10  water-animals: 5  water-ambient: 20  water-underground-creature: 5  axolotls: 5  ambient: 15ticks-per:  animal-spawns: 400  monster-spawns: 1  water-spawns: 1  ambient-spawns: 1  autosave: 6000

Это значения по умолчанию. Важно знать до их изменения, что per-player-mob-spawns в Paper включён по умолчанию, и он меняет смысл чисел: лимиты становятся поигровыми, а не на весь мир. Система гораздо лучше - один игрок в пещере больше не лишает спавна остальную карту, - но это значит, что monsters: 70 не общий потолок мира в 70, а бюджет, который несёт каждый игрок. На сервере с тридцатью игроками это очень много зомби.

Что стоит менять:

  • monsters: 70 снизить до 40 или 50 на сервере, где больше двадцати игроков. Мобные фермы будут давать меньше; время тика падает пропорционально.
  • ticks-per.monster-spawns: 1 поднять до 2. Это вдвое уменьшает частоту попыток спавна. Одна из самых дешёвых доступных побед, а разницу в игре трудно заметить.
  • ticks-per.autosave: 6000 - это пять минут. Оставьте, если только не видите периодических скачков: в этом случае смотрите раздел про чанки ниже, а не удлиняйте интервал, ведь более длинный интервал означает более крупный подвис и больше потерянной работы при падении.

В spigot.yml mob-spawn-range по умолчанию равен 8 чанкам. Он никогда не должен превышать вашу simulation distance, потому что мобы, заспавнившиеся за пределами радиуса тика, бессмысленны. Если поставить значение на единицу меньше simulation-distance, спавн сосредоточится там, где игроки действительно находятся.

nerf-spawner-mobs: false в spigot.yml превращает мобов из спавнеров в сущности без ИИ: они существуют, им можно наносить урон и их можно убить, но они не ищут путь и не думают. На сервере, полном гриндеров, это реальная экономия, и она заметно меняет то, как гриндеры работают, - так что решайте вместе с игроками, а не за них.

Наконец, entities.spawning.despawn-ranges в paper-world-defaults.yml управляет мягкой и жёсткой дистанцией despawn в vanilla, по умолчанию 32 и 128 блоков. Если снизить жёсткую дистанцию примерно до 96, исчезнут мобы, рядом с которыми нет игроков. Эта настройка взаимодействует с конструкциями ферм, рассчитанными на то, что мобы остаются, так что проверьте её.

Activation range и tracking range сущностей#

Обе настройки лежат в spigot.yml, и их постоянно путают.

spigot.yml
entity-activation-range:  animals: 32  monsters: 32  raiders: 48  misc: 16  water: 16  villagers: 32  flying-monsters: 32entity-tracking-range:  players: 48  animals: 48  monsters: 48  misc: 32  other: 64  display: 128

Activation range - это насколько близко должен быть игрок, чтобы сущность вообще тикала. За её пределами сущность существует, но не двигается, не ищет путь и не думает. Tracking range - насколько близко должен быть игрок, чтобы ему вообще отправили эту сущность: это забота клиента и трафика.

Экономит CPU именно activation range. Снижение animals и monsters до 24, а misc до 12 - распространённая и безопасная настройка для загруженного сервера. Видимое следствие в том, что мобы «просыпаются» при вашем приближении, а не находятся уже в движении, - в игре это почти незаметно и очень заметно, если вы наблюдаете за мобной фермой издалека. Не снижайте raiders: рейды должны идти к вам издалека, а низкое значение их ломает.

Tracking range в основном стоит трафика, а не времени тика. Если с CPU у сервера всё хорошо, но игроки жалуются на подвисания, когда на экране много сущностей, снижение animals и monsters до 32 помогает им больше, чем вам.

Две связанные вещи в том же файле: merge-radius (по умолчанию item: 2.5, exp: 3.0) управляет тем, насколько агрессивно выброшенные предметы и сферы опыта сливаются в единые сущности. Повышение item до 4.0 на сервере с крупными фермами заметно уменьшает число сущностей, а побочный эффект в том, что предметы, разбросанные на несколько блоков, слипаются, и это выглядит слегка странно. И item-despawn-rate: 6000 - это пять минут в тиках; alt-item-despawn-rate в paper-world-defaults.yml позволяет убирать булыжник и прочий хлам быстрее всего остального, что как раз подходит для шахтёрского сервера.

Хопперы, редстоун и работа с чанками#

Хопперы - самый частый источник лагов в отчётах профилировщика по плагинам, потому что каждый хоппер проверяет наличие предметов по расписанию, есть они там или нет.

spigot.yml
ticks-per:  hopper-transfer: 8  hopper-check: 1

hopper-check: 1 означает, что каждый хоппер каждый тик ищет предметы, которые можно забрать из контейнера сверху. Значение 8, равное скорости передачи, сокращает эту работу в восемь раз и делает хопперы чуть менее жадными. На сервере с системами сортировки предметов это одно из самых крупных изменений, которые вы можете сделать.

В paper-world-defaults.yml параметр hopper.disable-move-event: true не даёт Paper вызывать событие перемещения инвентаря Bukkit при передачах хоппера. Это большой выигрыш на сервере с множеством хопперов, и он ломает любой плагин, который слушает это событие, - а таких среди плагинов магазинов, логирования и защиты от дюпа немало. Прежде чем включать, проверьте список плагинов.

У редстоуна есть собственная настройка реализации, misc.redstone-implementation в paper-world-defaults.yml, по умолчанию vanilla. Вариант alternate-current - это переписанный алгоритм обновления редстоун-пыли, который заметно быстрее на больших редстоун-постройках и ведёт себя одинаково практически во всех реальных схемах. eigencraft - более старая альтернатива. На техническом сервере alternate-current - почти бесплатный выигрыш; на сервере для приверженцев чистого vanilla оставьте как есть.

Работа с чанками - другая периодическая цена. В paper-world-defaults.yml:

  • chunks.max-auto-save-chunks-per-tick по умолчанию равен 24. Снижение до 8 растягивает автосохранение на большее число тиков, превращая один заметный подвис в меньшую, но более долгую фоновую нагрузку. Это правильное решение для жалобы «сервер подвисает каждые пять минут».
  • chunks.entity-per-chunk-save-limit ограничивает, сколько сущностей данного типа сохраняется на чанк. Если поставить для experience_orb, arrow и snowball что-то вроде 50, чанк, в котором накопилось десять тысяч сфер опыта, не заморозит сервер при загрузке.
  • chunks.delay-chunk-unloads-by по умолчанию 10s и не даёт чанкам выгружаться и загружаться заново, пока игрок ходит туда-сюда через границу. Оставьте как есть.

В paper-global.yml параметр chunk-loading-basic.player-max-chunk-generate-rate по умолчанию не ограничен. Если поставить что-то вроде 10 чанков в секунду, один игрок на элитрах над свежей местностью не съест весь бюджет генерации чанков, пока мир у остальных перестаёт загружаться. Если исследование новой местности - регулярная жалоба, это та самая настройка. А ещё лучше сгенерировать местность заранее: в статье граница мира и предварительная генерация рассказано, как сделать это один раз инструментом, а не постоянно силами игроков.

Anti-xray и его цена#

anticheat.anti-xray в paper-world-defaults.yml по умолчанию выключен. Он скрывает руды от клиентов, так что текстур-пак или мод для x-ray не видят ничего полезного.

config/paper-world-defaults.yml
anticheat:  anti-xray:    enabled: true    engine-mode: 1    max-block-height: 64    update-radius: 2

Режим движка 1 заменяет скрытые блоки камнем в пакетах, отправляемых клиентам, - это дёшево. Режим 2 отправляет ещё и поддельные руды, что побеждает более изощрённые читы и стоит заметно больше CPU и трафика, потому что пакеты чанков сжимаются гораздо хуже. max-block-height: 64 ограничивает обфускацию уровнем ниже y=64, где и находятся руды, и именно это удерживает цену в разумных пределах.

Стоит ли оно того, зависит от сервера. На закрытом SMP с whitelist - нет. На публичном сервере выживания, где экономика держится на редкости алмазов, - да, в режиме движка 1. Это лишь одна часть более широкого вопроса, разобранного в статье защита от гриферов и античит.

Измерьте, поменяйте одно, измерьте снова#

Настройка без измерений - это гадание, и у каждой описанной выше настройки есть и цена, и польза.

  • /tps показывает тики в секунду за одну, пять и пятнадцать минут. Максимум - двадцать, и сервер превысить его не может, так что 20.0 означает «здоров» и ничего больше.
  • /mspt - число получше: миллисекунды на тик, с медианой и 95-м перцентилем за последние пять секунд, десять секунд и минуту. Бюджет тика - 50 мс. Сервер, в среднем выдающий 30 мс при 95-м перцентиле 48 мс, находится на пределе, хотя /tps говорит 20.0. Почему так, объясняет статья что на самом деле означает tick rate.
  • spark - это профилировщик. /spark profiler start, играйте несколько минут под реальной нагрузкой, /spark profiler stop, и вы получаете ссылку на дерево вызовов, где названы плагин, тип сущности или чанк, который делает работу. Свежие сборки Paper поставляются с ним; если команды /spark на вашем сервере нет, положите jar плагина в plugins/. Старая система Timings в Paper упразднена в его пользу. Как с этим работать, рассказано в статье как читать отчёт spark.

Поменяйте одну настройку, перезапустите и смотрите /mspt при той же нагрузке. Если менять шесть вещей сразу, вы никогда не узнаете, какая помогла, а одна из них наверняка сломала ферму.

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

Чего делать не нужно#

Не вставляйте готовый набор конфигов. Ходящие по сети обычно собраны под более старый Paper, и ключи, которых больше нет, молча игнорируются, а ключи, сменившие смысл, тихо что-нибудь ломают. Копируйте отдельные настройки вместе с причиной.

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

Не повышайте view distance только потому, что есть запас памяти. Ограничение - не память, а цена работы с чанками и сущностями на каждый тик. Сервер на 12 ГБ при view-distance=16 тикает хуже, чем тот же сервер при 8.

Не отключайте watchdog навсегда. max-tick-time=-1 в server.properties означает, что зависший сервер будет висеть вечно, а не выгрузит трассировку потоков, которая скажет вам почему.

Не настраивайте, пока не подобрали размер правильно. Если у тарифа одно ядро, а игроков тридцать, никакой конфигурационный файл его не спасёт. Статьи сколько RAM нужно серверу Minecraft и CPU или RAM для игровых серверов вместе подскажут, настраиваете вы или делите нехватку. А если ответ такой, что игроков больше, чем выдержит одна машина, то форма решения - сеть на прокси, а не машина побольше, см. сеть на прокси Velocity.

Последнее, что стоит сказать: Paper - не единственный форк. Pufferfish и Purpur надстраивают над ним дополнительные оптимизации и переключатели поведения ценой всё большего расхождения с vanilla. Запустить один из них - это загрузить jar и указать серверу на него, и всё в этом руководстве по-прежнему применимо, потому что они наследуют файлы конфигурации Paper и добавляют свои. Стоят ли лишние несколько процентов ещё одного слоя расхождений - вопрос суждения; для большинства серверов правильно настроенный Paper с правильным heap уже быстрее, чем железо, на котором он работает.

FAQ#

Какая настройка Paper самая эффективная?

view-distance в server.properties. Ничто другое рядом не стоит, потому что она умножает стоимость чанков, сущностей и сетевого трафика разом. Вторая - simulation-distance.

Почему у меня TPS 20, хотя сервер явно лагает?

TPS упирается в 20 и скрывает всё, что ниже предела. Используйте /mspt. Если медиана близка к 50 мс, сервер заканчивает тики едва вовремя, и любой скачок выводит его за предел. Игроки ощущают это как подвисания задолго до того, как сдвинется TPS.

Ломает ли уменьшение simulation distance фермы?

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

Стоит ли использовать anti-xray в Paper?

На публичном сервере выживания режим движка 1 обычно того стоит. Режим 2 стоит реального CPU и трафика и оправдан, только если x-ray действительно вредит вашей экономике. На сервере с whitelist не нужен ни один.

Мой сервер подвисает каждые пять минут. Что это?

Автосохранение. Снизьте chunks.max-auto-save-chunks-per-tick в paper-world-defaults.yml с 24 примерно до 8, чтобы работа растянулась на большее число тиков. Не удлиняйте вместо этого интервал автосохранения - подвис станет больше, а рискуете потерять больше прогресса.

Paper быстрее Fabric с модами оптимизации?

Они несопоставимы так, как предполагает вопрос. Paper оптимизирует сервер и сохраняет экосистему плагинов; Fabric с модами производительности оптимизирует модифицированный сервер и требует, чтобы клиенты ему соответствовали. Если ваши игроки заходят с немодифицированного лаунчера, выбор уже сделан. Обмен разобран в статье Paper, Fabric или vanilla.


Комментарии

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

0/2000