Оптимизация 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 мс, но во втором случае сервер балансирует на грани: любой всплеск нагрузки (взрыв крипера в фермерском комплексе, вход пяти игроков одновременно, запуск автосохранения) моментально уронит показатель.
| MSPT | TPS | Что это значит на практике |
|---|---|---|
| 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 без плагинов | до 10 | 2–3 ГБ |
| Paper + 20–30 плагинов | 20–40 | 4–6 ГБ |
| Средний модпак (60–120 модов) | 10–20 | 6–8 ГБ |
| Тяжёлый модпак (200+ модов) | 20–40 | 8–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 от сжатия.
Чек-лист перед тем, как что-то менять
- Снять базовый профиль spark на 3 минуты в пиковый онлайн.
- Записать текущие MSPT median и p95.
- Менять по одному параметру, перезапуск, повторный замер.
- Делать резервную копию перед каждым изменением конфигурации мира.
- Хранить рабочие конфиги отдельно — откат должен занимать минуту.
Такой же методичный подход работает и на других проектах — от 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.
Нет, если в логах нет постоянных Full GC. Высокий MSPT означает, что процессор не успевает обработать логику мира за 50 мс — это задача одного потока, и память тут ни при чём. Увеличение кучи наоборот удлинит паузы сборщика мусора. Сначала профилируйте spark, снизьте simulation-distance и разберитесь со скоплениями сущностей.
Начните с view-distance=8 и simulation-distance=4, замерьте MSPT в пиковый онлайн. Если медиана держится ниже 25 мс, поднимайте view-distance по одному шагу до 10–12. Simulation-distance выше 6 на большом онлайне почти всегда лишний: игрок не замечает разницы, а нагрузка на тик растёт квадратично.