Руководство по оптимизации сервера Minecraft
Это руководство актуально для версии 1.21.5-1.21.7. Некоторые советы могут быть применимы и для версий 1.15 - 1.21.4.
Основано и является переводом этого руководства
ВВЕДЕНИЕ
Не существует руководства, которое даст вам идеальные результаты. У каждого сервера свои потребности и ограничения на то, чем вы можете или готовы пожертвовать. Суть оптимизации — в экспериментах с настройками для точной подгонки под нужды вашего сервера. Это руководство лишь поможет вам понять, какие опции влияют на производительность и что именно они изменяют.
Подготовка
Предварительная генерация мира (Map pregen)
Благодаря различным оптимизациям генерации чанков, добавленным за последние годы, предварительная генерация карты теперь полезна в основном на серверах со слабыми, однопоточными или ограниченными процессорами. Однако её часто используют для создания карт мира для таких плагинов, как Pl3xMap или Dynmap.
Если вы всё же хотите предварительно сгенерировать мир, можно использовать плагин Chunky. Обязательно установите границу мира, чтобы игроки не генерировали новые чанки! Учтите, что предварительная генерация может занять несколько часов в зависимости от установленного радиуса. Помните, что на Paper и его форках TPS не будет страдать от загрузки чанков, но скорость самой загрузки может значительно снизиться, если процессор вашего сервера перегружен.
Ключевой момент: Верхний мир, Нижний мир (Nether) и Край (End) имеют отдельные границы мира, которые нужно настраивать для каждого измерения. Нижний мир в 8 раз меньше Верхнего (если это не изменено датапаком), поэтому если вы установите неправильный размер, игроки могут оказаться за пределами границы мира!
Обязательно установите ванильную границу мира (/worldborder set [диаметр]
), так как она ограничивает некоторые механики, способные вызывать скачки лагов, например, поиск структур по картам сокровищ.
Конфигурации
Сеть
server.properties
network-compression-threshold
Оптимальное значение: 256
Как это работает?
Эта опция устанавливает порог размера пакета, после которого сервер попытается его сжать. Установка более высокого значения может сэкономить ресурсы процессора за счёт увеличения потребления трафика, а значение -1
отключает сжатие. Более высокое значение также может навредить клиентам с медленным интернет-соединением. Если ваш сервер находится в одной сети с прокси или на той же машине (с пингом менее 2 мс), отключение этой опции (-1
) будет полезным, так как скорость внутренней сети обычно справляется с дополнительным несжатым трафиком.
purpur.yml
use-alternate-keepalive
Оптимальное значение: true
Как это работает?
Вы можете включить альтернативную систему keepalive от Purpur, чтобы игроков с плохим соединением не так часто отключало по тайм-ауту. Известна несовместимость с TCPShield и NeoProtect.
При включении этой опции сервер отправляет keepalive-пакет игроку раз в секунду и отключает его по тайм-ауту только в том случае, если ни на один из пакетов не был получен ответ в течение 30 секунд. Ответ на любой из них в любом порядке сохранит игрока на сервере. Другими словами, ваших игроков не будет кикать из-за одного потерянного пакета. ~ https://purpurmc.org/docs/Configuration/#use-alternate-keepalive
Чанки
server.properties
simulation-distance
Оптимальное значение: 4
Как это работает?
simulation-distance
(дистанция симуляции) — это расстояние в чанках вокруг игрока, на котором сервер будет обрабатывать тики. Проще говоря, это расстояние, на котором "происходят события": плавится руда в печах, растут урожай и деревья и т.д. Эту опцию стоит намеренно установить низкой, около 3
или 4
, благодаря существованию view-distance
. Это позволяет загружать больше чанков, не обрабатывая их, что даёт игрокам возможность видеть дальше без сильного удара по производительности.
view-distance
Оптимальное значение: 7
Как это работает?
view-distance
(дистанция прорисовки) — это расстояние в чанках, которое будет отправлено клиентам игроков, аналог no-tick-view-distance
из Paper.
Общая дистанция видимости будет равна наибольшему значению из simulation-distance
и view-distance
. Например, если дистанция симуляции равна 4, а дистанция прорисовки — 12, то клиенту будут отправляться чанки на расстоянии до 12 чанков.
spigot.yml
view-distance
Оптимальное значение: default
Как это работает?
Эта опция переопределяет значение из server.properties
, если не установлено в default
. Следует оставить её в default
, чтобы управлять обеими дистанциями (симуляции и прорисовки) в одном месте для удобства.
paper-world-defaults.yml
delay-chunk-unloads-by
Оптимальное значение: 10s
Как это работает?
Эта опция позволяет настроить, как долго чанки остаются загруженными после ухода игрока. Это помогает избежать постоянной загрузки и выгрузки одних и тех же чанков, когда игрок движется туда-сюда. Слишком высокие значения могут привести к тому, что одновременно будет загружено слишком много чанков. В местах, куда часто телепортируются, рассмотрите возможность постоянной загрузки этой области — это будет легче для сервера, чем постоянная загрузка и выгрузка чанков.
prevent-moving-into-unloaded-chunks
Оптимальное значение: true
Как это работает?
Если включено, не позволяет игрокам перемещаться в незагруженные чанки, что предотвращает синхронные загрузки, которые нагружают основной поток и вызывают лаги. Вероятность того, что игрок попадёт в незагруженный чанк, тем выше, чем ниже ваша дистанция прорисовки (view-distance
).
entity-per-chunk-save-limit
# Оптимальные значения:
area_effect_cloud: 8
arrow: 16
breeze_wind_charge: 8
dragon_fireball: 3
egg: 8
ender_pearl: 8
experience_bottle: 3
experience_orb: 16
eye_of_ender: 8
fireball: 8
firework_rocket: 8
llama_spit: 3
splash_potion: 8
lingering_potion: 8
shulker_bullet: 8
small_fireball: 8
snowball: 8
spectral_arrow: 16
trident: 16
wind_charge: 8
wither_skull: 4
Как это работает?
С помощью этой опции вы можете установить лимиты на количество сохраняемых сущностей определённого типа. Следует установить лимит для каждого типа снарядов, чтобы избежать проблем с сохранением огромного количества снарядов и падением сервера при их загрузке. Вы можете добавить сюда любую сущность по её ID (см. Minecraft Wiki). Настройте лимиты по своему усмотрению. Рекомендуемое значение для всех снарядов — около 10
. Вы также можете добавить в список и другие сущности по их типам. Эта опция не предназначена для предотвращения создания игроками огромных моб-ферм.
Мобы
bukkit.yml
spawn-limits
# Оптимальные значения:
monsters: 20
animals: 5
water-animals: 2
water-ambient: 2
water-underground-creature: 3
axolotls: 3
ambient: 1
Как это работает?
Формула для расчёта лимита мобов: [количество игроков] * [лимит]
. Логично, что чем меньше эти числа, тем меньше мобов вы увидите. Опция per-player-mob-spawns
в Paper добавляет дополнительное ограничение, обеспечивая равномерное распределение мобов между игроками. Уменьшение лимитов — палка о двух концах: да, серверу будет легче, но на некоторых режимах игры мобы, спавнящиеся естественным путём, являются важной частью геймплея. Можно опуститься до 20 и ниже, если правильно настроить mob-spawn-range
. Установка mob-spawn-range
на меньшее значение создаст ощущение, что вокруг каждого игрока больше мобов. Если вы используете Paper, вы можете установить лимиты для каждого мира отдельно в его конфигурации.
ticks-per
# Оптимальные значения:
monster-spawns: 10
animal-spawns: 400
water-spawns: 400
water-ambient-spawns: 400
water-underground-creature-spawns: 400
axolotl-spawns: 400
ambient-spawns: 400
Как это работает?
Эта опция устанавливает, как часто (в тиках) сервер пытается спавнить определённых живых существ. Водным и эмбиент-мобам не нужно спавниться каждый тик, так как их обычно не убивают так быстро. Что касается монстров: небольшое увеличение времени между попытками спавна не должно повлиять на скорость спавна даже на моб-фермах. В большинстве случаев все значения здесь должны быть выше 1
. Увеличение этих значений также поможет вашему серверу лучше справляться с областями, где спавн мобов отключён.
spigot.yml
mob-spawn-range
Оптимальное значение: 3
Как это работает?
Позволяет уменьшить радиус (в чанках) вокруг игрока, в котором будут спавниться мобы. В зависимости от игрового режима и количества игроков на вашем сервере, вы можете захотеть уменьшить это значение вместе с spawn-limits
из bukkit.yml
. Установка этого значения ниже создаст ощущение, что вокруг вас больше мобов. Это значение должно быть меньше или равно вашей дистанции симуляции (simulation-distance
) и никогда не должно быть больше жёсткой дистанции деспавна (hard despawn range
), делённой на 16.
entity-activation-range
# Оптимальные значения:
animals: 16
monsters: 24
raiders: 48
misc: 8
water: 8
villagers: 16
flying-monsters: 48
Как это работает?
Здесь вы можете установить расстояние от игрока, на котором сущность должна находиться, чтобы она "тикала" (обрабатывалась сервером). Уменьшение этих значений помогает производительности, но может привести к тому, что мобы будут неотзывчивыми, пока игрок не подойдёт к ним очень близко. Слишком сильное занижение может сломать некоторые моб-фермы; чаще всего страдают фермы железа.
entity-tracking-range
# Оптимальные значения:
players: 48
animals: 48
monsters: 48
misc: 32
other: 64
Как это работает?
Это расстояние в блоках, с которого сущности будут видны. Если сущность дальше, информация о ней просто не будет отправляться игрокам. Если установить это значение слишком низко, мобы могут появляться из ниоткуда прямо перед игроком. В большинстве случаев это значение должно быть больше, чем entity-activation-range
.
tick-inactive-villagers
Оптимальное значение: false
Как это работает?
Эта опция позволяет вам контролировать, будут ли жители обрабатываться (тикать) за пределами диапазона активации. Если включить, жители будут вести себя как обычно, игнорируя диапазон активации. Отключение поможет производительности, но может сбивать с толку игроков в некоторых ситуациях. Может вызвать проблемы с фермами железа и обновлением товаров у жителей.
nerf-spawner-mobs
Оптимальное значение: true
Как это работает?
Вы можете сделать так, чтобы у мобов, заспавненных из спавнера, не было ИИ (искусственного интеллекта). "Занерфленные" мобы ничего не будут делать. Вы можете заставить их прыгать в воде, изменив spawner-nerfed-mobs-should-jump
на true
в конфигурации мира Paper.
paper-world-defaults.yml
despawn-ranges
# Оптимальные значения:
ambient:
hard: 72
soft: 30
axolotls:
hard: 72
soft: 30
creature:
hard: 72
soft: 30
misc:
hard: 72
soft: 30
monster:
hard: 72
soft: 30
underground_water_creature:
hard: 72
soft: 30
water_ambient:
hard: 72
soft: 30
water_creature:
hard: 72
soft: 30
Как это работает?
Позволяет настроить радиусы деспавна сущностей (в блоках). Уменьшите эти значения, чтобы быстрее удалять мобов, которые находятся далеко от игрока. soft
(мягкий) радиус стоит держать около 30
, а hard
(жёсткий) радиус настроить так, чтобы он был немного больше вашей дистанции симуляции (simulation-distance
), чтобы мобы не исчезали мгновенно, как только игрок отойдёт чуть дальше загруженного чанка (это хорошо работает из-за опции delay-chunk-unloads-by
). Когда моб оказывается за пределами hard
радиуса, он мгновенно исчезает. Когда он находится между soft
и hard
радиусами, у него есть случайный шанс исчезнуть. hard
радиус должен быть больше soft
. Вы должны настроить это значение в соответствии с вашей дистанцией прорисовки, используя формулу (simulation-distance * 16) + 8
. Это частично учитывает чанки, которые ещё не выгрузились после ухода игрока.
per-player-mob-spawns
Оптимальное значение: true
Как это работает?
Эта опция определяет, должен ли спавн мобов учитывать, сколько мобов уже находится вокруг конкретного игрока. Это позволяет обойти многие проблемы, связанные с неравномерным спавном из-за того, что игроки строят фермы, забивающие весь лимит мобов на сервере. Включение этой опции создаст опыт спавна, более похожий на одиночную игру, и позволит вам установить более низкие spawn-limits
. Включение этой опции немного влияет на производительность, но этот эффект перекрывается улучшениями от возможности снизить spawn-limits
.
max-entity-collisions
Оптимальное значение: 2
Как это работает?
Переопределяет одноимённую опцию в spigot.yml
. Позволяет определить, сколько столкновений одна сущность может обработать за раз. Значение 0
приведёт к невозможности толкать другие сущности, включая игроков. Значения 2
должно быть достаточно в большинстве случаев. Стоит отметить, что это сделает игровое правило maxEntityCramming
бесполезным, если его значение будет выше значения этой опции.
update-pathfinding-on-block-update
Оптимальное значение: false
Как это работает?
Отключение этой опции приведёт к уменьшению вычислений поиска путей, что повысит производительность. В некоторых случаях это может привести к тому, что мобы будут казаться более "лагучими"; они будут пассивно обновлять свой путь каждые 5 тиков (0.25 сек).
fix-climbing-bypassing-cramming-rule
Оптимальное значение: true
Как это работает?
Включение этой опции исправляет баг, из-за которого на карабкающихся сущностей не действовало правило cramming
. Это предотвратит скапливание абсурдного количества мобов (например, пауков) в маленьких пространствах, даже если они карабкаются.
armor-stands.tick
Оптимальное значение: false
Как это работает?
В большинстве случаев вы можете безопасно установить это значение в false
. Если вы используете стойки для брони или плагины, которые изменяют их поведение, и сталкиваетесь с проблемами, включите эту опцию обратно. Это предотвратит толкание стоек для брони водой и воздействие на них гравитации.
armor-stands.do-collision-entity-lookups
Оптимальное значение: false
Как это работает?
Здесь вы можете отключить столкновения стоек для брони. Это поможет, если у вас много стоек для брони и вам не нужно, чтобы они с чем-либо сталкивались.
tick-rates
# Оптимальные значения:
behavior:
villager:
validatenearbypoi: 60
acquirepoi: 120
sensor:
villager:
secondarypoisensor: 80
nearestbedsensor: 80
villagerbabiessensor: 40
playersensor: 40
nearestlivingentitysensor: 40
Как это работает?
Эта опция определяет, как часто (в тиках) срабатывают указанные поведения и сенсоры. Похоже, что acquirepoi
у жителей является самым "тяжёлым" поведением, поэтому его интервал был значительно увеличен. Уменьшите его, если возникнут проблемы с поиском пути у жителей.
purpur.yml
zombie.aggressive-towards-villager-when-lagging
Оптимальное значение: false
Как это работает?
Если включено, зомби перестанут атаковать жителей, если TPS сервера упадёт ниже порога, установленного в lagging-threshold
в purpur.yml
.
entities-can-use-portals
Оптимальное значение: false
Как это работает?
Эта опция может отключить использование порталов для всех сущностей, кроме игрока. Это предотвращает загрузку чанков сущностями при переходе между мирами, которая обрабатывается в основном потоке. Побочный эффект — сущности не смогут проходить через порталы.
villager.lobotomize.enabled
Оптимальное значение: true
Как это работает?
WARNING
Эту опцию следует включать только в том случае, если жители вызывают лаги! В противном случае проверки поиска пути могут, наоборот, снизить производительность.
У "лоботомизированных" жителей отключается ИИ, и они лишь время от времени обновляют свои товары. Включение этой опции будет лоботомизировать жителей, которые не могут найти путь к своей цели. Если освободить их, они должны вернуться в нормальное состояние.
villager.search-radius
# Оптимальные значения:
acquire-poi: 16
nearest-bed-sensor: 16
Как это работает?
Радиус, в пределах которого жители будут искать рабочие места и кровати. Это значительно повышает производительность при большом количестве жителей, но не позволит им обнаруживать рабочие блоки или кровати, которые находятся дальше указанного значения.
Разное
spigot.yml
merge-radius
# Оптимальные значения:
item: 3.5
exp: 4.0
Как это работает?
Эта опция определяет расстояние, на котором предметы и сферы опыта будут объединяться в один стак, уменьшая количество тикающих на земле предметов. Слишком высокое значение создаст иллюзию, что предметы или опыт исчезают, сливаясь вместе. Слишком высокое значение сломает некоторые фермы, а также позволит предметам "телепортироваться" сквозь блоки. Никаких проверок для предотвращения слияния предметов через стены не проводится (если только не активирована настройка Paper fix-items-merging-through-walls
). Опыт объединяется только при создании.
hopper-transfer
Оптимальное значение: 8
Как это работает?
Время в тиках, которое воронки будут ждать перед перемещением предмета. Увеличение этого значения поможет улучшить производительность, если на вашем сервере много воронок, но сломает часы на воронках и, возможно, системы сортировки предметов, если установить его слишком высоким.
hopper-check
Оптимальное значение: 8
Как это работает?
Время в тиках между проверками воронкой наличия предмета над собой или в инвентаре над ней. Увеличение этого значения поможет производительности, если на вашем сервере много воронок, но сломает часы на воронках и системы сортировки, основанные на потоках воды.
paper-world-defaults.yml
alt-item-despawn-rate
# Оптимальные значения:
enabled: true
items:
cobblestone: 300
netherrack: 300
sand: 300
red_sand: 300
gravel: 300
dirt: 300
short_grass: 300
pumpkin: 300
melon_slice: 300
kelp: 300
bamboo: 300
sugar_cane: 300
twisting_vines: 300
weeping_vines: 300
oak_leaves: 300
spruce_leaves: 300
birch_leaves: 300
jungle_leaves: 300
acacia_leaves: 300
dark_oak_leaves: 300
mangrove_leaves: 300
cherry_leaves: 300
cactus: 300
diorite: 300
granite: 300
andesite: 300
scaffolding: 600
Как это работает?
Этот список позволяет установить альтернативное время (в тиках) для исчезновения определённых типов выброшенных предметов, делая его быстрее или медленнее стандартного. Эту опцию можно использовать вместо плагинов для очистки предметов вместе с merge-radius
для улучшения производительности.
redstone-implementation
Оптимальное значение: ALTERNATE_CURRENT
Как это работает?
Заменяет стандартную систему обработки редстоуна на более быстрые, альтернативные версии, которые уменьшают избыточные обновления блоков, снижая нагрузку на сервер. Использование не-ванильной реализации может привести к незначительным несоответствиям в работе очень сложных редстоун-схем, но выигрыш в производительности намного перевешивает возможные нишевые проблемы. Не-ванильная реализация также может исправить другие несоответствия в работе редстоуна, вызванные CraftBukkit.
Реализация ALTERNATE_CURRENT
основана на моде Alternate Current. Больше информации об этом алгоритме можно найти на странице мода.
hopper.disable-move-event
Оптимальное значение: false
Как это работает?
Событие InventoryMoveItemEvent
не срабатывает, пока нет плагина, который активно его слушает. Это означает, что вы должны устанавливать это значение в true
только если у вас есть такие плагины и вам не важно, что они не смогут реагировать на это событие. Не устанавливайте в true
, если вы хотите использовать плагины, которые слушают это событие, например, плагины для защиты регионов!
hopper.ignore-occluding-blocks
Оптимальное значение: true
Как это работает?
Определяет, будут ли воронки игнорировать контейнеры внутри полных блоков, например, вагонетку с воронкой внутри блока песка или гравия. Если оставить эту опцию включённой, это сломает некоторые механизмы, основанные на таком поведении.
tick-rates.mob-spawner
Оптимальное значение: 2
Как это работает?
Эта опция позволяет настроить, как часто должны обрабатываться спавнеры. Более высокие значения означают меньше лагов, если у вас много спавнеров, однако, если установить значение слишком высоким (относительно задержки ваших спавнеров), скорость спавна мобов снизится.
optimize-explosions
Оптимальное значение: true
Как это работает?
Установка этого значения в true
заменяет ванильный алгоритм взрывов на более быстрый, ценой небольшой неточности при расчёте урона от взрыва. Обычно это незаметно.
treasure-maps.enabled
Оптимальное значение: false
Как это работает?
Генерация карт сокровищ — чрезвычайно ресурсоёмкий процесс и может "подвесить" сервер, если структура, которую он пытается найти, находится в несгенерированном чанке. Включать эту опцию безопасно только в том случае, если вы предварительно сгенерировали мир и установили ванильную границу мира.
treasure-maps.find-already-discovered
# Оптимальные значения:
loot-tables: true
villager-trade: true
Как это работает?
Стандартное значение этой опции заставляет вновь сгенерированные карты искать неисследованные структуры, которые обычно находятся в ещё не сгенерированных чанках. Установка этого значения в true
делает так, что карты могут вести к уже открытым ранее структурам. Если вы не измените это на true
, вы можете столкнуться с зависанием или падением сервера при генерации новых карт сокровищ. villager-trade
относится к картам, которые продают жители, а loot-tables
— ко всему, что генерирует лут динамически, например, сундуки с сокровищами, в данжах и т.д.
tick-rates.grass-spread
Оптимальное значение: 4
Как это работает?
Время в тиках между попытками сервера распространить траву или мицелий. Это приведёт к тому, что большие участки земли будут немного дольше превращаться в траву или мицелий. Установка этого значения около 4
должна хорошо работать, если вы хотите снизить нагрузку без заметного замедления скорости распространения.
tick-rates.container-update
Оптимальное значение: 1
Как это работает?
Время в тиках между обновлениями контейнеров. Увеличение этого значения может помочь, если обновления контейнеров вызывают у вас проблемы (что случается редко), но облегчает появление у игроков рассинхронизации при взаимодействии с инвентарями (предметы-призраки).
non-player-arrow-despawn-rate
Оптимальное значение: 20
Как это работает?
Время в тиках, через которое стрелы, выпущенные мобами, должны исчезать после попадания. Игроки всё равно не могут их поднять, так что вы можете смело установить это значение около 20
(1 секунда).
creative-arrow-despawn-rate
Оптимальное значение: 20
Как это работает?
Время в тиках, через которое стрелы, выпущенные игроками в творческом режиме, должны исчезать после попадания. Игроки всё равно не могут их поднять, так что вы можете смело установить это значение около 20
(1 секунда).
purpur.yml
dolphin.disable-treasure-searching
Оптимальное значение: true
Как это работает?
Предотвращает поиск дельфинами структур, аналогично картам сокровищ.
teleport-if-outside-border
Оптимальное значение: true
Как это работает?
Позволяет телепортировать игрока на спавн мира, если он окажется за пределами границы мира. Полезно, так как ванильную границу мира можно обойти, а урон, который она наносит игроку, можно смягчить.
Плагины из серии "слишком хорошо, чтобы быть правдой"
Плагины для удаления предметов с земли
Абсолютно не нужны, так как их можно заменить опциями merge-radius и alt-item-despawn-rate, которые, к тому же, более гибки в настройке, чем базовые конфигурации сервера. Такие плагины, как правило, тратят больше ресурсов на сканирование и удаление предметов, чем если бы предметы не удалялись вообще.
Плагины для стака мобов
Очень трудно оправдать их использование. Стакинг естественно заспавненных мобов вызывает больше лагов, чем если бы они не стакались, из-за того, что сервер постоянно пытается заспавнить новых мобов. Единственный "допустимый" случай использования — для спавнеров на серверах с большим их количеством.
Плагины, включающие/выключающие другие плагины
Всё, что включает или выключает плагины во время работы сервера, чрезвычайно опасно. Загрузка плагина таким образом может вызвать фатальные ошибки с отслеживанием данных, а отключение плагина может привести к ошибкам из-за удаления зависимостей. Команда /reload
страдает от тех же самых проблем, и вы можете прочитать о них подробнее в блоге me4502.
Что лагает? — измерение производительности
Spark
Spark — это плагин, который позволяет профилировать использование процессора и памяти вашего сервера. Вы можете прочитать, как им пользоваться, в его документации. Также есть руководство о том, как найти причину скачков лагов, здесь.