Предельная оптимизация сервера Minecraft: когда базовой уже мало

Туториал Предельная оптимизация сервера minecraft: когда базовой уже мало

  • Автор темы Автор темы mcdev
  • Дата начала Дата начала

mcdev

Администратор
Администратор
Клиент
Рубли
207.0

Предельная оптимизация сервера Minecraft: когда базовой уже мало​

Снимок экрана 2025-11-29 в 03.13.29.webp

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

– тонкая настройка server.properties, spigot.yml, bukkit.yml, paper-* и purpur.yml;
– работа с ядрами Paper / Pufferfish / Purpur;
– прогрузка карты, борьба с лаг-фермами;
– флаги запуска Java и правильное железо.

Важно: если ваш сервер и так летает, TPS ~20, жалоб нет — не нужно сломя голову менять все конфиги «по гайду».
Предельная оптимизация нужна, когда:

– онлайн растёт,
– карта разрастается,
– фермы и сложные механики душат вашу машину,
– а базовые советы уже не помогают.



Содержание​





1. Общие принципы предельной оптимизации​


Главное правило: не трогай то, что и так хорошо работает.

Перед тем как менять конфиги:

  • Измерьте проблему: сделайте тайминги (Paper Timings) или профилирование через Spark. Ищите, что реально ест время тиков: сущности, чанки, redstone, плагины.
  • Меняйте точечно: один параметр → перезапуск → наблюдение. Не крутите всё подряд «по списку».
  • Думайте про геймплей. Почти каждое «ускорение» — это удар по ванильности. Иногда игрокам важнее фермы и механики, чем +2 TPS.
  • Всегда делайте бэкапы: мир + конфиги + базы плагинов. Перед экспериментами — отдельная копия.
  • Не верьте слепым «пакетным» конфигаам из рандомного Телеграма. То, что летает на одном сервере, может убить ваш.

Предельная оптимизация — это хирургия, а не молоток.
Сначала диагноз, потом аккуратный разрез, а не «срезать всё, что мешает TPS».




2. Что НЕ делать (и за что карма мстит админам)​


2.1. Не используем слитый софт​


Слитые премиум-плагины / ядра:

  • часто содержат бэкдоры и вредоносный код;
  • не получают обновлений и фиксов;
  • убивают репутацию и безопасность сервера.

Если нет денег на платный плагин — лучше найти бесплатный аналог, чем ставить «кряк».

2.2. Не живём на старых версиях ради «лагов меньше»​


Да, какие-то старые версии легче для железа, но:

  • они часто дырявые по безопасности;
  • игроки ждут новый контент;
  • антиботы и новые плагины ориентируются на актуальные ветки.

Если нужен максимум производительности — лучше оптимизировать актуальный Paper/Purpur, чем сидеть на заброшенном форке ради призрачных плюсов.

2.3. Не используем датапаки с функциями вместо плагинов​


Большинство датапаков писались под одиночку. На сервере они:

  • плохо масштабируются под онлайн;
  • часто нагружают тики;
  • сложно дебажатся.

Для серверной логики почти всегда лучше плагин, а не датапак с кучей функций.

2.4. Не берём «дурные» хостинги​


Дёшево ≠ выгодно. Плохой хостинг убьёт все ваши оптимизации:

  • слабое железо, забитые диски, зашитый CPU;
  • нет защиты от DDoS;
  • нестабильная сеть.

Если есть выбор «хорошее ядро на плохом железе» или «нормальное ядро на адекватном VPS» — выигрывает второе.

2.5. Не трогаем экспериментальные / заброшенные форки​


Что НЕ использовать (как основное ядро):

  • Yatopia
  • Airplane (старый)
  • Patina
  • Mirai
  • Sugarcane
  • JettPack
  • Fusion

Это либо заброшенные, либо экспериментальные форки, которые могут вести себя непредсказуемо, ломать плагины и миры.




3. Выбор ядра: что брать, а что выкинуть навсегда​


Что использовать в 2025 году​


  • Paper — стандартизованный форк Spigot, хорошая производительность и стабильность, море гайдов.
  • Pufferfish — форк Paper с дополнительными оптимизациями (DAB, entity_timeouts и пр.).
  • Purpur — форк Paper/Pufferfish с огромным количеством геймплейных и производительных настроек; идеален для «предельной» настройки.

Актуальные ссылки и сборки ядер для сервера Minecraft вы всегда можете найти в разделе «Ядра серверов» на mcdev.su.

Рекомендация:

  • Небольшой / средний сервер — Paper или Purpur.
  • Высокий онлайн, жёсткая оптимизация — Pufferfish или Purpur с включёнными pufferfish-патчами.




4. Прогрузка карты заранее (Chunky, worldborder)​


Генерация чанков «на лету» — один из главных убийц TPS и диска, особенно на 1.18+.

Лучшее, что можно сделать для производительности:

  • задать игрокам разумный worldborder;
  • заранее прогрузить карту внутри этого круга;
  • запретить бесконечный «раннинг в никуда» в поисках новых чанков.

Шаги по прогрузке (на примере Chunky)​


1. Ставим плагин Chunky.
2. Настраиваем радиус:

Код:
/chunky radius <радиус_в_блоках_в_каждую_сторону>

3. Выбираем мир:

Код:
/chunky world <название_мира>

4. Ставим worldborder (ванильный):

Код:
/worldborder set <радиус_в_блоках_×2>

5. При желании ставим более красивый барьер через ChunkyBorder.
6. Запускаем прогрузку:

Код:
/chunky start

Перед этим обязательно:

  • оцените место на диске (используйте калькулятор типа World Size Calculator);
  • делайте прогрузку в «мертвое» время, когда почти нет онлайна.




5. Работа с конфигами: подход и приоритеты​


Золотое правило: открыли конфиг — сначала читаем комментарии, потом меняем.

Общий порядок:

1. server.properties — базовые радиусы, сеть, idle-timeout.
2. bukkit.yml — спавн мобов, автосейвы.
3. spigot.yml — активность сущностей, воронки, взрывы.
4. paper-global.yml и paper-world-defaults.yml — глубокая оптимизация мира.
5. purpur.yml — куча дополнительных тумблеров.
6. pufferfish.yml — DAB и тонкая работа с сущностями.

Меняйте значения постепенно, проверяя, как это влияет на:

– TPS и MSPT (в Spark/Timings),
– поведение ферм и игроков,
– жалобы в чате.

---


5.1 Важные настройки server.properties​


Некоторые ключевые параметры:

  • network-compression-threshold: 128 / 256 / 512
    – Меньше порог = больше сжатия = больше нагрузка на CPU, легче слабым клиентам.
    – Больше порог = меньше нагрузка на CPU, больше трафик.
    – Для большинства серверов подойдёт 256–512.
  • enforce-secure-profile=false
    – Отключает модерацию/репорты чата (1.19.1+).
    – Для полной вырубки уведомлений имеет смысл поставить плагин типа AntiPopup.
  • entity-broadcast-range-percentage=75–100
    – Насколько далеко игрок «видит» сущности.
    – Чем ниже, тем меньше пакетов → легче серверу и сети, но хуже визуально.
  • max-tick-time=-1
    – Ванильный watchdog, который гасит сервер при больших лагах.
    – На Paper/Purpur есть свой watchdog; часто этот параметр можно выключить (-1), но делать это лучше осознанно.
  • use-native-transport=true
    – Включает оптимизированный сетевой стек под Linux.
    – На Linux — true, на других системах — лучше оставить false.
  • view-distance: 2–4
    – Сколько чанков вокруг игрока прогружается и тикает.
    – Мощное влияние на производительность и на геймплей.
  • simulation-distance: 4–6
    – Чанки, где «жизнь идёт» (мобы, фермы и т.д.).
    – Слишком маленькие значения ломают фермы, слишком большие — душат сервер.
  • idle-timeout: 10–20
    – Время, после которого AFK-игрок считается бездействующим.
    – Можно кикать AFK или комбинировать с AFK-настройками Purpur.
  • allow-flight: true
    – Встроенный «античит» от полёта лучше выключить и использовать нормальный плагин.
  • snooper-enabled: false
    – Старый сбор телеметрии (в новых версиях уже неактуален).
  • sync-chunk-writes=false
    – Асинхронная запись чанков. В Paper/Purpur обычно уже настроено; меняем только если осознаём последствия.




5.2 Важные настройки bukkit.yml​


Лимиты спавна сущностей

Код:
spawn-limits:
  monsters: 20
  animals: 8
  water-animals: 3
  water-ambient: 1
  axolotls: 3
  water-underground-creature: 3
  ambient: 1

Это глобальные лимиты спавна по группам мобов.
Чем меньше значения — тем меньше мобов, тем проще серверу, но тем пустее мир.

Частота спавна

Код:
ticks-per:
  animal-spawns: 400
  monster-spawns: 10
  water-spawns: 600
  ...

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

Автосейв

Код:
autosave: 6000 / 16000

Как часто мир сохраняется. Сильно трогать не стоит:

  • слишком редко — можно потерять прогресс при падении;
  • слишком часто — лаги от постоянных записей.

Другие полезные настройки

  • query-plugins: false — немного повышает безопасность, скрывая список плагинов.
  • period-in-ticks: 300 — как часто выгружать неактивные чанки из памяти.
  • Блок ticks-per + spawn-limits вместе задают «характер» мира: много мобов и нагрузка выше, мало мобов — проще серверу, но скучнее игрокам.




5.3 Оптимизация spigot.yml​


mob-spawn-range: 3–4

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

hanging-tick-frequency: 250

Частота проверки декора (картины, рамки и т.п.).
Больше — меньше нагрузка, чуть больше визуальных артефактов.

merge-radius

Код:
merge-radius:
  item: 4.5
  exp: 8.75

Радиус, в котором предметы и опыт объединяются.
Увеличение радиуса резко уменьшает число сущностей на полу — хороший буст к TPS.

netty-threads: ~1/4 ядер

Например, на 8 логических ядрах → 2–4 потока.
Не стоит ставить слишком много — лишнее только создаст конкуренцию потоков.

Удаление стрел/трезубцев

Код:
arrow-despawn-rate: 300
trident-despawn-rate: 600

Чем быстрее исчезают стрелы и трезубцы, тем меньше мусора в мире.

Воронки

Код:
hopper-amount: 3–9
hopper-transfer: 8–24
hopper-check: 8–24

Полностью определяют работу воронок:

  • меньше amount / чаще transfer/check — чуть ближе к ваниле, но тяжелее серверу;
  • больше значения — воронки медленнее, но сильно облегчают тики.

Другие важные параметры

  • restart-on-crash: false — лучше использовать внешний скрипт/панель для автоперезапуска.
  • save-user-cache-on-stop-only: true — уменьшает лишние операции записи во время работы.
  • nerf-spawner-mobs: true — убирает AI у мобов из спавнеров, сильно полезно для гигантских ферм.
  • log-villager-deaths / log-named-deaths: false — экономит место в логах.
  • max-tnt-per-tick — ограничивает количество TNT, обрабатываемых за тик (важно для анархий/креатива).
  • max-tick-time: tile/entity — лимиты времени обработки тайлов и сущностей, ещё один предохранитель от фризов.

entity-activation-range

Один из самых влиятельных блоков:

Код:
entity-activation-range:
  animals: 10
  monsters: 12
  raiders: 12
  misc: 4
  water: 4
  villagers: 8
  flying-monsters: 24
  ...

Это расстояния, на которых сущности считаются «активными».
Снижение значений даёт огромный прирост производительности, но может ломать фермы и поведение мобов.
Трогать аккуратно, по чуть-чуть.




5.4 Важные настройки paper-global.yml​


timings.enabled / verbose: false

Paper-тайминги полезны для диагностики, но постоянный сбор — лишняя нагрузка.
Обычно:

  • timings: enabled: false
  • включаем и снимаем отчёт только, когда нужно.

Для постоянного профилинга лучше использовать Spark.

max-joins-per-tick: 1

Ограничивает количество подключений в тик. Отличная защита от волны заходов/ботов.
Чуть растёт очередь входа, но TPS живее всех живых.

Прочее

  • use-rgb-for-named-text-colors — даёт цветной вывод в консоль.
  • fix-entity-position-desync: true — лечит рассинхрон позиций сущностей.
  • use-dimension-type-for-custom-spawners / use-alternative-luck-formula — тонкие настройки генерации/лут-таблиц; трогаем только, если понимаем эффект.

chunk-system

Параметры вроде:

Код:
chunk-system:
  gen-parallelism: default
  io-threads: -1
  worker-threads: -1

– -1 обычно означает «подобрать автоматически (половина/часть ядер)».
– при желании можно вручную указать worker-threads чуть меньше, чем количество доступных ядер, оставляя ядро-другое системе.




5.5 paper-world-defaults.yml — мир, despawn и редстоун​


despawn-ranges

Код:
despawn-ranges:
  ambient:
    hard: 56
    soft: 30
  monster:
    hard: 56
    soft: 30
  ...

Расстояния, на которых сущности пропадают.
Чем ближе к игроку они despawn’ятся, тем меньше висит «мусора» в дальних чанках.

keep-spawn-loaded: false

Отключает постоянную прогрузку спавна.
Если у вас нет ферм/механик, завязанных на спавн-чанки — это хороший бонус к производительности.

max-entity-collisions: 2

Сколько столкновений сущность может обработать за тик.
Снижение значения уменьшает лаги от скоплений мобов и предметов.

max-auto-save-chunks-per-tick: 8+

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

Ещё полезные параметры

  • parrots-are-unaffected-by-player-movement — косметика, но уменьшает «дергания» попугаев.
  • zombies-target-turtle-eggs: false — защита ферм черепах.
  • disable-end-credits: true — убирает лишний экран титров.
  • fix-items-merging-through-walls: true — чинит глупый баг с предметами.
  • prevent-moving-into-unloaded-chunks: true — не даёт игрокам «продавить» генерацию чанков спринтом/элитрами.
  • hopper.* — крупный блок оптимизаций воронок (cooldown-when-full, disable-move-event, ignore-occluding-blocks).
  • armor-stands.tick / do-collision-entity-lookups: false — сильный удар по лаг-машинам на стойках.




5.6 purpur.yml — агрессивная оптимизация геймплея​


Purpur добавляет огромное количество тумблеров. Несколько заметных:

  • use-alternate-keepalive: true
    – Делает жизнь лучше игрокам с плохим интернетом (меньше ложных киков). Несовместим с некоторыми прокси/сервисами.
  • dont-send-useless-entity-packets: true
    – Меньше сетевого мусора.
  • disable-mushroom-updates / disable-note-block-updates / disable-chorus-plant-updates: true
    – Полезно, если игроки не строят редстоун-машины на этих блоках или вы используете кастомные ресурспаки.
  • max-joins-per-second
    – Ещё один уровень защиты от бот-флуда.
  • lagging-threshold: 17.0
    – Ниже какого TPS Purpur считает сервер лагающим и включает дополнительные оптимизации.
  • observer.disable-clock: true
    – Вырубает простые «часики» на наблюдателях. Сильно режет потенциал лаг-машин, но не понравится редстоун-маньякам.
  • entities-can-use-portals: false
    – Запрещает мобам использовать порталы; защищает от chunk-loader’ов на порталах.
  • arrow.movement-resets-despawn-counter: false
    – Стрела не «обновляет» таймер исчезновения в полёте; меньше вечных стрел в мире.
  • invulnerable-while-accepting-resource-pack: true
    – Защищает игроков, пока они грузят ресурспак.
  • sleep-ignore-nearby-mobs: true
    – Позволяет ложиться спать даже при мобах рядом; удобно на выживалках.
  • armorstand.*
    – Набор настроек, которые практически убивают возможность строить лаг-машины на стойках для брони (движение, коллизии и т.п.).
  • villager.*
    – Настройки «мозгов» жителей (brain-ticks, lobotomize, spawn-iron-golem), позволяющие держать огромные деревни без убийства TPS.
  • logger.suppress-...: true
    – Чистит консоль от тонн бесполезных предупреждений.
  • seed.structure.*
    – Отдельные сиды для структур (шахты, клады). Плюс к уникальности мира и защите от «запомненных» сидов.
  • AFK-блок (idle-timeout.*) — подробная политика AFK: кикать/не кикать, тикать/не тикать сущности рядом, считать ли AFK спящими и т.п.

Purpur — идеальное место, чтобы отключить самые тяжёлые/эксплуатируемые механики, если они мешают серверу жить.




5.7 pufferfish.yml — DAB и таймауты сущностей​


Pufferfish уже из коробки довольно агрессивно оптимизирован. Меняем здесь только если:

– понимаем, что делаем,
– видим в профилировщике явную проблему с сущностями/снарядами.

Ключевые блоки:

  • entity_timeouts — ограничение времени жизни определённых сущностей:

    Код:
    entity_timeouts:
      SNOWBALL: 200
      EGG: 200
      LLAMA_SPIT: 40
      FIREBALL: 100
      DRAGON_FIREBALL: 100

    Защита от лаг-машин на снежках, яйцах и прочем.
  • max-loads-per-projectile — сколько чанков может догрузить снаряд.
    – Низкие значения защищают от «стреляющих загрузчиков чанков», но могут ломать экзотические механики.
  • DAB (distance-based activation):

    Код:
    start-distance: 6–8
    max-tick-freq: 35–40
    activation-dist-mod: 7

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




6. Anti-Xray и сиды: защита и уникальность мира​


Anti-Xray от Paper/Purpur​


Анти-xray — штука не только про «борьбу с читерами», но и про нагрузку:

  • правильная настройка режима (обфускация vs engine);
  • списков блоков, которые маскируются;
  • радиуса действия.

Если включить его слишком агрессивно, можно:

– убить FPS клиентам со слабыми ПК;
– добавить нагрузку на CPU.

Поэтому:

  • внимательно читаем комментарии к разделу anti-xray в paper-/purpur-конфиге;
  • включаем только то, что действительно нужно на вашем типе сервера;
  • тестируем на нескольких игроках с разным железом.

Индивидуальные сиды структур​


Через spigot.yml и purpur.yml можно задать отдельные сиды для генерации:

  • шахт;
  • кладов;
  • других структур.

Плюс:

– защита от «запомненных» сидов с других серверов;
– сложнее предсказать расположение структур с помощью сайтов/утилит.




7. AFK-фермы и политика AFK-игроков​


AFK-фермы — вечная боль админа: игроки их любят, сервер — ненавидит.

Подход зависит от вашего проекта:

  • RP/ваниль — AFK почти не нужны, можно кикать людей через idle-timeout.
  • Фермо-/техно-сервер — AFK неизбежны, но их нужно грамотно ограничивать.

Примерный набор настроек:

  • idle-timeout в server.properties — время до статуса AFK (в минутах).
  • AFK-блок в Purpur (примерная структура):

    Код:
    idle-timeout:
      kick-if-idle: false
      tick-nearby-entities: false
      count-as-sleeping: false
      update-tab-list: false
      mobs-target: false

    Пояснения:

    kick-if-idle — кикать ли игрока после AFK;
    tick-nearby-entities — тикаются ли рядом сущности (фермы);
    count-as-sleeping — считаются ли AFK «спящими» для пропуска ночи;
    update-tab-list — обновлять ли статус в TAB;
    mobs-target — могут ли мобы агриться на AFK.

Простая и рабочая схема:

– AFK-игроки не кикаются, но рядом с ними ничего не тикает;
– AFK не считаются спящими, не ломают ночь;
– мобы их не убивают (чтобы не теряли вещи из-за лагов);
– фермы, требующие активного участия, поощряются больше, чем «поставил птичку и ушёл».




8. Флаги запуска сервера Minecraft (Java / G1GC)​


Флаги запуска — это настройки JVM: управление памятью, сборкой мусора и стабильностью.

8.1 Общая логика настройки JVM​


Несколько базовых правил:

  • Не давайте Java всю оперативку.
    Обычно Xmx = 50–75% от общей RAM сервера, остальное — системе и другим процессам (БД, панель, прокси).
  • Xms должен равняться Xmx.
    Тогда куча сразу выделяется полностью, JVM не фрагментирует память в процессе и работает стабильнее.
  • Используем G1GC.
    Старые сборщики (Parallel, CMS) для Minecraft не дают преимуществ на современных версиях Java.
  • Не городим свои флаги поверх «рандомного набора».
    Берём проверенный набор (Aikar flags) и при необходимости аккуратно дорабатываем.

8.2 Пример скрипта запуска с G1GC​


Код:
#!/usr/bin/env bash

while true; do
  java -Xms8192M -Xmx8192M \
    -XX:+UseG1GC \
    -XX:+ParallelRefProcEnabled \
    -XX:MaxGCPauseMillis=200 \
    -XX:+UnlockExperimentalVMOptions \
    -XX:+DisableExplicitGC \
    -XX:+AlwaysPreTouch \
    -XX:G1HeapWastePercent=5 \
    -XX:G1MixedGCCountTarget=4 \
    -XX:InitiatingHeapOccupancyPercent=15 \
    -XX:G1MixedGCLiveThresholdPercent=90 \
    -XX:G1RSetUpdatingPauseTimePercent=5 \
    -XX:SurvivorRatio=32 \
    -XX:+PerfDisableSharedMem \
    -XX:MaxTenuringThreshold=1 \
    -Dusing.aikars.flags=https://mcflags.emc.gs \
    -Daikars.new.flags=true \
    -XX:G1NewSizePercent=30 \
    -XX:G1MaxNewSizePercent=40 \
    -XX:G1HeapRegionSize=8M \
    -XX:G1ReservePercent=20 \
    -Dfile.encoding=UTF-8 \
    -jar server.jar

  echo Restarting in 5 seconds...
  echo Press CTRL + C to cancel.
  sleep 5
done

8.3 Расшифровка основных Java-флагов​


ФлагЧто делает
-Xms8192M / -Xmx8192MНачальный и максимальный размер кучи (heap). Делая их равными, мы сразу выделяем фиксированный объём памяти, уменьшая фрагментацию и дергания от динамического расширения кучи.
-XX:+UseG1GCВключает сборщик мусора G1GC, оптимизированный для больших куч и долгоживущих приложений вроде Minecraft. Делит память на регионы и очищает их частично, снижая длинные паузы.
-XX:+ParallelRefProcEnabledВключает параллельную обработку «сложных» ссылок (Soft/Weak/Phantom, Finalizer). Ускоряет сборку мусора на многопроцессорных системах.
-XX:MaxGCPauseMillis=200Желаемое максимальное время паузы GC в миллисекундах. Не жёсткий лимит, а цель для JVM: она старается подбирать размер регионов и частоту сборок так, чтобы укладываться в это значение.
-XX:+UnlockExperimentalVMOptionsРазблокирует экспериментальные опции JVM, которые в обычном режиме недоступны, в том числе некоторые G1GC-тюнинги.
-XX:+DisableExplicitGCИгнорирует вызовы System.gc() из кода плагинов/ядра. Защитный флаг от «дурных» плагинов, которые дергают полную сборку мусора в самый неподходящий момент.
-XX:+AlwaysPreTouchПрогревает все страницы памяти при старте JVM: сразу резервирует и «трогает» всю кучу. Это делает запуск чуть дольше, но убирает микрофризы от ленивого выделения страниц позднее.
-XX:G1HeapWastePercent=5Допустимый процент «мусорной» фрагментации кучи перед началом смешанной (mixed) сборки. Меньшее значение → чаще и раньше запускаются смешанные сборки, уменьшая фрагментацию.
-XX:G1MixedGCCountTarget=4Цель по количеству смешанных циклов сборки мусора после марк-фазы. Влияет на то, как быстро G1 вычищает старое поколение.
-XX:InitiatingHeapOccupancyPercent=15Процент заполнения кучи, при котором G1 начинает concurrent-marking (фоновую разметку живых объектов). Более низкое значение запускает GC заранее, чтобы избежать резких скачков использования памяти.
-XX:G1MixedGCLiveThresholdPercent=90Максимальный процент «живых» данных в регионе, чтобы этот регион попал в mixed-сборку. Чем выше значение, тем меньше регионов считается подходящими для очистки.
-XX:G1RSetUpdatingPauseTimePercent=5Процент времени пауз GC, который можно тратить на обновление RSet (remembered set). Небольшое значение помогает ограничить, сколько времени GC «тратит» на внутренние структуры.
-XX:SurvivorRatio=32Соотношение между Eden и Survivor-памятью в молодом поколении. Чем больше число, тем меньше Survivor-область, тем быстрее объекты перемещаются в старое поколение.
-XX:+PerfDisableSharedMemОтключает использование shared memory для PerfData (всякие JMX/monitoring структуры). Чуть уменьшает накладные расходы и потенциальные проблемы с правами.
-XX:MaxTenuringThreshold=1Порог «старения» объектов. После 1 «пережитой» сборки мусора объект перемещается из молодого поколения в старое. Полезно для паттерна нагрузки Minecraft, где много короткоживущих объектов.
-Dusing.aikars.flags=...Просто маркер (system property) для того, что используются флаги Aikar. Непрямая настройка, но помогает понять в логах, какой набор флагов применён.
-Daikars.new.flags=trueЕщё один маркер, включающий «новую» версию набора флагов Aikar. Влияет на то, какие именно параметры и комбинации используются.
-XX:G1NewSizePercent=30Минимальный процент кучи, который будет отведён под молодое поколение (new generation). Важен для нагрузки с большим количеством короткоживущих объектов.
-XX:G1MaxNewSizePercent=40Максимальный процент кучи под молодое поколение. В паре с предыдущим флагом ограничивает диапазон размеров young gen.
-XX:G1HeapRegionSize=8MРазмер региона G1. Куча делится на регионы фиксированного размера (например, 8 МБ). Для больших куч и Minecraft это хорошее типовое значение.
-XX:G1ReservePercent=20Процент кучи, который резервируется как «запас» для предотвращения полного заполнения. Помогает избегать резких, тяжёлых сборок, когда память почти забита.
-Dfile.encoding=UTF-8Фиксирует кодировку по умолчанию как UTF-8. Защищает от странностей с логами и файлами на разных системах.

Важно: эти флаги не магия. Они не спасут сервер с отвратительным кодом плагинов, забитым диском и дикими лаг-машинами. JVM-тюнинг — последняя стадия, когда всё остальное уже приведено в порядок.




9. Практический алгоритм предельной оптимизации​


Чтобы не утонуть в сотнях параметров, держите чёткий порядок:

  1. Соберите метрики
    Запустите Spark/Timings, посмотрите, где тратится время: сущности, чанки, плагины, redstone.
  2. Почините «очевидное»
    Уберите сломанные плагины, оптимизируйте/запретите явные лаг-машины, ограничьте откровенно безумные фермы.
  3. Прогрузите карту и ограничьте мир
    Chunky + worldborder — огромный вклад в стабильность.
  4. Настройте server.properties
    view-distance / simulation-distance / entity-broadcast-range / idle-timeout.
  5. Оптимизируйте bukkit.yml и spigot.yml
    Лимиты спавна, merge-radius, entity-activation-range, воронки.
  6. Доведите до ума paper-* и purpur.yml
    DAB, despawn-ranges, hopper/armor-stands/redstone, villager/AFK-логика.
  7. Аккуратно троньте pufferfish.yml
    Если и после всего остального карта/сущности душат сервер — включайте тяжёлую артиллерию.
  8. Установите адекватные флаги запуска
    G1GC, фиксированный объём памяти, автоперезапуск при краше.
  9. Закрепите результат
    Бэкапы, документация изменений (что и зачем меняли), и только потом — дальнейшие эксперименты.




10. Краткий чек-лист по шагам​


ШагДействие
1Сделать бэкап мира, плагинов и всех конфигов.
2Снять профилировку (Spark/Timings), понять, где именно лаги.
3Перейти на Paper/Pufferfish/Purpur, если ещё не перешли.
4Прогрузить карту через Chunky, поставить worldborder.
5Настроить server.properties (view-distance, simulation-distance, idle-timeout и т.п.).
6Оптимизировать bukkit.yml и spigot.yml: спавн мобов, merge-radius, entity-activation-range.
7Тонко настроить paper-global.yml и paper-world-defaults.yml.
8Включить/настроить нужные тумблеры в purpur.yml.
9При необходимости поджать сущности через pufferfish.yml.
10Выставить флаги запуска JVM (G1GC, память, автоперезапуск).
11Починить AFK-политику и фермы (idle-timeout + Purpur AFK-блок).
12Снова снять метрики и сравнить результат с исходным.




11. FAQ по предельной оптимизации сервера​


Нужно ли мне всё это, если сервер на 20 человек и TPS 19.9?​


Нет. В таком случае достаточно базовой оптимизации. Предельная оптимизация — для проектов, где:

– онлайн стабильно высокий,
– есть тяжёлые фермы,
– и действительно есть проблемы с производительностью.

Можно ли просто взять «готовые конфиги» и не думать?​


Очень нежелательно. Чужие конфиги писались под чужое железо и чужой геймплей.
Минимум — внимательно перечитайте все изменённые параметры и поймите, что именно они делают.

Как понять, что я «перегнул» с оптимизацией?​


Признаки:

  • ломаются фермы и механики без очевидной причины;
  • игроки жалуются, что мобы «тупят» или «пропадают на глазах»;
  • TPS есть, а ощущается «мёртвый» мир.

Если TPS хороший, но игрокам скучно и всё «не живёт» — вы переборщили с entity-activation-range, despawn-ranges или DAB.

Стоит ли трогать pufferfish.yml, если я не уверен?​


Лучше не трогать. Pufferfish уже из коробки даёт хороший прирост, а более жёсткие настройки нужно вводить только после анализа профилировки.

Есть ли «идеальный» набор значений для всех серверов?​


Нет. Характер нагрузки:

– мини-игры;
– анархия;
– ваниль;
– техно-проекты;

— радикально отличается. То, что идеально для мини-игр, может убить ванильный сервер.

С чего начать, если хочется «максимума», но страшно?​


С базовых шагов:

1. Переход на Paper/Purpur.
2. Прогрузка карты.
3. server.properties + bukkit/spigot (без экстремальных значений).
4. Флаги запуска JVM.

А уже потом — аккуратные правки paper-/purpur-/pufferfish-конфигов по одному параметру за раз.

Как понять, что флаги Java настроены адекватно?​


  • Сервер не упирается в OOM, не падает по памяти.
  • Нет регулярных длинных фризов на GC (по логам и ощущениям).
  • MSPT остаётся в разумных пределах даже под нагрузкой.
  • При этом остаётся запас RAM под систему и другие процессы.

Если всё так — не нужно «дотюнивать» флаги ради флагов.