Skip to content

Руководство по оптимизации сервера 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

yaml
# Оптимальные значения:
    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

yaml
# Оптимальные значения:
    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

yaml
# Оптимальные значения:
    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

yaml
# Оптимальные значения:
      animals: 16
      monsters: 24
      raiders: 48
      misc: 8
      water: 8
      villagers: 16
      flying-monsters: 48

Как это работает?

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

entity-tracking-range

yaml
# Оптимальные значения:
      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

yaml
# Оптимальные значения:
      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

yaml
# Оптимальные значения:
  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

yaml
# Оптимальные значения:
          acquire-poi: 16
          nearest-bed-sensor: 16

Как это работает?

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


Разное

spigot.yml

merge-radius

yaml
# Оптимальные значения:
      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

yaml
# Оптимальные значения:
      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

yaml
# Оптимальные значения:
      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 — это плагин, который позволяет профилировать использование процессора и памяти вашего сервера. Вы можете прочитать, как им пользоваться, в его документации. Также есть руководство о том, как найти причину скачков лагов, здесь.