← Blog

Оптимизация TPS сервера Minecraft: причины лагов и настройка

Par Benjamin D. · PDG

· Mis à jour le 12 сентября 2026 г. · Lecture 8 min

Содержание

TPS сервера Minecraft — главный показатель здоровья мира: 20 тиков в секунду означают, что логика игры успевает обработаться полностью, а просадка до 15–17 уже ощущается как «резина» при ударах, рассинхрон вагонеток и застрявшие мобы. Ниже разберём, что реально влияет на производительность: частота одного ядра, объём памяти, поведение сборщика мусора и дистанция прогрузки чанков.



Что такое TPS сервера Minecraft и как его правильно измерять

Мир Minecraft обновляется 20 раз в секунду. Один тик — это 50 миллисекунд бюджета, за которые движок обязан просчитать мобов, редстоун, воду, рост растений, хопперы, поиск пути, сетевые пакеты и логику плагинов или модов. Если расчёт занял 40 мс — всё хорошо, остаток времени процессор простаивает. Если 70 мс — тик «не влез», и TPS падает ниже 20.

Поэтому смотреть только на цифру TPS недостаточно. Гораздо информативнее MSPT (milliseconds per tick) — фактическое время обработки одного тика. TPS остаётся ровно 20.0 и при MSPT 10 мс, и при MSPT 49 мс, но во втором случае сервер балансирует на грани: любой всплеск нагрузки (взрыв крипера в фермерском комплексе, вход пяти игроков одновременно, запуск автосохранения) моментально уронит показатель.

MSPTTPSЧто это значит на практике
0–20 мс20.0Большой запас, можно поднимать дистанцию прогрузки
20–35 мс20.0Рабочее состояние, следить за пиками
35–50 мс20.0Запаса нет, любая нагрузка даст лаг
>50 мс<20Мир отстаёт: рассинхрон, «резиновые» удары, задержка блоков

Базовые команды диагностики

/tps
/mspt
/spark tps
/spark health --upload
/spark profiler start --timeout 180

Плагин spark (Paper/Purpur/Fabric/Forge) даёт разбивку по конкретным источникам нагрузки: какие плагины, какие чанки, какие типы сущностей съедают тик. Для Forge/Fabric аналогичную роль играет встроенный профилировщик, но spark читается проще и выгружает отчёт в браузер одной ссылкой.

Если вы только выбираете площадку под проект и хотите заранее понимать, на каком железе будет крутиться мир, посмотрите хостинг Minecraft — там указаны характеристики процессоров и накопителей, от которых напрямую зависит MSPT.



Одноядерная частота: почему Minecraft не любит «много ядер»

Основной цикл мира в ванильном и Paper-сервере однопоточный. Всё, что происходит в одном мире — тики блоков, сущности, редстоун, обработка команд плагинов — выполняется последовательно в одном потоке. Дополнительные ядра используются под сжатие чанков, сетевой ввод-вывод, сборку мусора, генерацию мира (частично) и автосохранение, но сам «мозг» мира упирается в один поток.

Отсюда практический вывод: процессор с 32 медленными ядрами будет хуже держать TPS сервера Minecraft, чем 8-ядерный Ryzen с высокой тактовой частотой и сильным IPC. Именно поэтому под Minecraft берут высокочастотные десктопные Ryzen, а не многоядерные серверные CPU с низким бустом.

Что даёт высокая частота на практике

  • Редстоун и техноблоки. Сложные схемы, сортировщики, автоферма с сотнями хопперов — чистая нагрузка на один поток.
  • Pathfinding мобов. Каждый моб в загруженном чанке ищет путь; на 200+ сущностей это заметные миллисекунды.
  • Плагины и моды. Тяжёлые модпаки (создание машин, магия, автоматизация) добавляют свои тики в тот же поток.
  • Генерация чанков. При исследовании новых территорий игроками частота напрямую определяет, будут ли «фризы» при полёте на элитрах.

Общие и не общие ресурсы

Второй фактор — соседство. Если ядро делится между десятками экземпляров, в пиковые часы ваш тик будет ждать своей очереди. Признак проблемы: MSPT скачет пилой без роста онлайна и без изменений в мире. Диагностировать можно через /spark health: там видно steal time и общее состояние машины.

# в консоли Linux-машины, если мир вы ведёте сами
top -bn1 | head -5
vmstat 1 5    # колонка "st" (steal) должна быть близка к 0

Накопитель тоже участвует: NVMe против обычного SSD — это разница во времени автосохранения региона и в скорости подгрузки чанков при исследовании. На HDD сохранение большого мира легко превращается в регулярный микролаг каждые пять минут.



RAM, сборщик мусора и правильные Java-флаги

Распространённое заблуждение: «дам 32 ГБ — лагов не будет». На деле избыточная куча вредит. Чем больше heap, тем дольше полный цикл сборки мусора, и тем длиннее стоп-паузы, которые видны игрокам как одномоментные фризы.

Сколько памяти реально нужно

КонфигурацияОнлайнРазумный heap
Ванилла / Paper без плагиновдо 102–3 ГБ
Paper + 20–30 плагинов20–404–6 ГБ
Средний модпак (60–120 модов)10–206–8 ГБ
Тяжёлый модпак (200+ модов)20–408–12 ГБ

Важно: нехватка RAM и низкий TPS — разные болезни. Если памяти мало, вы увидите постоянные Full GC в логах и пилообразный график heap. Если памяти достаточно, а MSPT всё равно высокий — проблема в логике мира, а не в объёме.

Флаги запуска

Классический набор Aikar под G1GC остаётся рабочим стандартом для Java 17/21:

java -Xms6G -Xmx6G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:G1MixedGCCountTarget=4 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 \
  -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -jar paper.jar nogui

Ключевые моменты: -Xms равен -Xmx (heap не «дышит»), AlwaysPreTouch резервирует память сразу, DisableExplicitGC запрещает плагинам дёргать сборщик вручную. В панели Pterodactyl эти флаги задаются в переменных окружения экземпляра или в поле дополнительных аргументов Java — перезапуск применит их сразу, консоль покажет строку запуска.

Отдельно про Java-версию

1.20.5+ требует Java 21. Переход с Java 17 на 21 сам по себе даёт небольшой, но бесплатный выигрыш по паузам GC за счёт улучшений в G1. Проверить версию:

java -version


Дистанция прогрузки чанков — самый недооценённый параметр

Нагрузка растёт квадратично от радиуса. view-distance 10 — это 21×21 = 441 чанк на игрока. view-distance 16 — уже 33×33 = 1089 чанков, то есть в 2,5 раза больше работы на каждого. При 30 онлайн разница колоссальная.

С версии 1.18 параметры разделены, и это ключ к оптимизации:

  • view-distance — сколько чанков клиент видит (визуальная дальность, отправка данных);
  • simulation-distance — в каком радиусе реально тикают мобы, редстоун, рост растений, вода.

Держать большую видимость дёшево, а большую симуляцию — дорого. Рабочая связка для публичного проекта:

# server.properties
view-distance=10
simulation-distance=5
max-players=60
network-compression-threshold=256
sync-chunk-writes=false
entity-broadcast-range-percentage=80

simulation-distance=5 почти не заметен игроку (фермы работают в радиусе рядом с ним), но снимает с тика огромный объём расчётов. sync-chunk-writes=false переносит запись чанков в асинхронный поток — на NVMe это безопасно и убирает микрофризы при сохранении.

Тонкая настройка Paper

Файлы config/paper-world-defaults.yml и config/paper-global.yml дают самый большой прирост на тяжёлых мирах:

entities:
  spawning:
    despawn-ranges:
      monster:
        soft: 28
        hard: 96
    per-player-mob-spawns: true
  behavior:
    mobs-can-always-pick-up-loot:
      zombies: false
      skeletons: false
chunks:
  max-auto-save-chunks-per-tick: 8
  delay-chunk-unloads-by: 10s
collisions:
  max-entity-collisions: 2
misc:
  redstone-implementation: ALTERNATE_CURRENT

ALTERNATE_CURRENT — переписанный алгоритм редстоуна, который на крупных схемах снимает значительную часть нагрузки без изменения поведения большинства механизмов. Детали параметров описаны в официальной документации PaperMC.

Предгенерация мира

Генерация новых чанков — одна из самых тяжёлых операций. Если карта заранее сгенерирована, игроки при исследовании не вызывают всплесков MSPT. С плагином Chunky:

/chunky world world
/chunky center 0 0
/chunky radius 5000
/chunky start
/chunky progress

Запускайте предгенерацию ночью при пустом онлайне и обязательно после этого делайте резервную копию. Автоматические бэкапы на стороне панели плюс ручная точка перед крупными операциями — правило, которое экономит нервы.

Мировая граница

Ограничьте карту, иначе размер региона будет расти бесконечно, а вместе с ним — время сохранения и объём резервных копий:

/worldborder set 10000
/worldborder warning distance 100


Поиск виновника: сущности, плагины и типовые ловушки

Когда база настроена, а TPS сервера Minecraft всё ещё проседает, нужно искать конкретный источник. Порядок действий — от самого частого к редкому.

1. Скопления сущностей

Фермы мобов, брошенные предметы, лодки, стойки для брони, вагонетки. Быстрая проверка:

/spark profiler start --timeout 120
# после отчёта — смотрим вкладку по типам entity
/minecraft:kill @e[type=item,distance=..200]   # аккуратно, удаляет дроп

В server.properties обязательно держите включённым ограничитель скопления:

max-entity-cramming=24

2. Хопперы

Каждый хоппер проверяет содержимое над собой каждый тик. Сотня хопперов в одном сортировщике — это ощутимая доля MSPT. Решения: заменять цепочки на водные транспортёры, использовать воронки только в конечных точках, включать в Paper оптимизации disable-hopper-move-event.

3. Плагины и моды

Типичные пожиратели тика — динамические карты, античиты с тяжёлыми проверками, плагины защиты регионов с частым сканированием, логгеры блоков с синхронной записью в БД. Профиль spark покажет их поимённо. Если логгер пишет в SQLite — переведите его на MySQL или увеличьте интервал сброса буфера.

4. Автосохранение

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

5. Сеть и задержка

Важно отличать низкий TPS от высокого пинга. Если /tps показывает 20.0, а игроки жалуются на «лаги» — проблема в канале, а не в тике. Смотрите потери пакетов, маршрут до площадки и network-compression-threshold. Значение 256 обычно оптимально; на очень быстром канале имеет смысл поднять его, чтобы разгрузить CPU от сжатия.

Чек-лист перед тем, как что-то менять

  1. Снять базовый профиль spark на 3 минуты в пиковый онлайн.
  2. Записать текущие MSPT median и p95.
  3. Менять по одному параметру, перезапуск, повторный замер.
  4. Делать резервную копию перед каждым изменением конфигурации мира.
  5. Хранить рабочие конфиги отдельно — откат должен занимать минуту.

Такой же методичный подход работает и на других проектах — от Rust до Palworld: сначала измерение, потом изменение. Полный список поддерживаемых игр есть в разделе Все наши игровые серверы, а технические разборы по конфигурации мы регулярно публикуем в Блог Fly-Serv. По актуальным системным требованиям клиента и серверной части всегда стоит сверяться с официальным сайтом Minecraft.



Итоги

Стабильные 20 тиков держатся на трёх опорах: высокая частота одного ядра, разумный объём памяти с корректными флагами GC и аккуратная дистанция симуляции. Измеряйте MSPT, а не только TPS, профилируйте spark перед правками, предгенерируйте карту и ограничивайте мир границей. Один параметр за раз, замер после каждого изменения — и мир перестанет «резинить» даже в пиковый онлайн.



FAQ

Почему TPS показывает 20.0, но игроки всё равно жалуются на лаги?

Скорее всего, проблема не в тике, а в сети или в клиенте. Проверьте MSPT командой /mspt: если медианное значение ниже 35 мс, мир считается нормально. Далее смотрите пинг игроков, потери пакетов и значение network-compression-threshold. Отдельно проверьте p95 по MSPT — редкие пики в 80–100 мс дают ощущение рывков при формально идеальном TPS.

Поможет ли увеличение RAM с 8 до 16 ГБ, если MSPT высокий?

Нет, если в логах нет постоянных Full GC. Высокий MSPT означает, что процессор не успевает обработать логику мира за 50 мс — это задача одного потока, и память тут ни при чём. Увеличение кучи наоборот удлинит паузы сборщика мусора. Сначала профилируйте spark, снизьте simulation-distance и разберитесь со скоплениями сущностей.

Какие значения view-distance и simulation-distance выставить для 50 игроков?

Начните с view-distance=8 и simulation-distance=4, замерьте MSPT в пиковый онлайн. Если медиана держится ниже 25 мс, поднимайте view-distance по одному шагу до 10–12. Simulation-distance выше 6 на большом онлайне почти всегда лишний: игрок не замечает разницы, а нагрузка на тик растёт квадратично.