Сервер Minecraft лагает и TPS ниже 20: диагностика через Spark и пошаговая оптимизация
Если сервер Minecraft лагает — сначала проверь TPS командой /tps. Норма — 20, ниже 18 — уже проблема. Поставь Spark, запусти /spark profiler start --timeout 60 в момент лага, открой ссылку из консоли и смотри Flame Graph. Самый широкий блок = главный виновник. Дальше в статье — как всё это читать и что именно крутить.
Если сервер Minecraft лагает, первым делом смотри на TPS: норма — ровно 20. Упал ниже 18 — игроки ощущают рывки и задержки. Быстрый способ найти виновника — профайлер Spark, который показывает, что именно жрёт время каждого тика, вплоть до конкретного плагина или моба.
Что такое TPS и MSPT и почему они падают?
TPS (Ticks Per Second) — количество тиков в секунду. Minecraft обрабатывает игровой мир тиками: двигает мобов, растит траву, обрабатывает редстоун. Идеально — 20 тиков в секунду, то есть один тик каждые 50 мс. Если тик занимает больше 50 мс, сервер не успевает выдавать 20 TPS и начинает «замедляться».
MSPT (Milliseconds Per Tick) — время в миллисекундах, которое уходит на один тик. Связь простая: MSPT ≤ 50 мс → TPS = 20. Если MSPT = 100 мс → TPS ≈ 10, мир работает вдвое медленнее. Посмотреть MSPT можно прямо в игре через F3 (как оператор или в одиночной), а точнее — через Spark.
- Слишком много мобов и энтити в одном месте — каждый просчитывается каждый тик
- Перегруженные плагины (особенно экономика, Claims, античит с тяжёлой логикой)
- Генерация новых чанков на лету — самая частая причина резких лагспайков
- Редстоун-«вечные двигатели» или бесконечные фармы мобов без лимитов
- Слабый процессор — Minecraft однопоточный, частота важнее числа ядер
Как установить Spark и запустить диагностику?
Spark — бесплатный профайлер для Paper, Purpur, Fabric, Forge и Velocity. Скачай актуальную версию с modrinth.com/mod/spark, брось JAR в папку plugins/ (или mods/ для Fabric), перезапусти сервер. После этого в консоли или чате доступны команды /spark.
Запускаем профиль на 60 секунд — пока идёт лаг:
- /spark profiler start --timeout 60 — запустить профиль на минуту
- Подождать, пока сервер лагает (важно — нужно поймать момент просадки)
- Spark напечатает ссылку вида spark.lucko.me/XXXXXX — открой в браузере
- В веб-просмотрщике переключись в режим Flame Graph (кнопка вверху)
Flame Graph — это перевёрнутое дерево вызовов. Самые широкие прямоугольники внизу — самые «горячие» места, там сервер тратит больше всего времени. Ищи широкие блоки с именами плагинов или методов вроде tickEntities, doTick, processBlockEvent.
Как читать отчёт Spark: на что смотреть в первую очередь?
После открытия ссылки в браузере вверху страницы — сводка: средний MSPT за период профилирования и средний TPS. Если MSPT > 40 мс — уже проблема, > 80 мс — критично.
- ServerTickStartEvent / tickEntities — тут живёт нагрузка от мобов и энтити
- Название плагина в стеке вызовов (например, EssentialsX, Towny, WorldGuard) — плагин виноват
- ChunkSystem / ServerChunkCache — проблема с чанками, чаще всего генерация новых
- RedstoneCircuit / BlockTick — лишний редстоун или блочная логика
Если плагин занимает больше 10% общего времени тика — это уже повод либо его настроить, либо искать замену. Spark также показывает статистику через /spark health — там TPS, MSPT, загрузка CPU и RAM прямо в консоли без открытия браузера.
Нашёл проблему через Spark — что теперь делать?
Нашёл узкое место — хорошо. Теперь устраняем. Ниже — главные рычаги для Paper/Purpur-серверов, которые реально влияют на TPS:
- Прегенерируй мир заранее — используй плагин Chunky (modrinth.com/plugin/chunky). Сгенерируй радиус 3000-5000 блоков до старта сервера. Это убирает лагспайки при исследовании, которые Spark покажет как ChunkSystem.
- Снизь лимиты мобов в bukkit.yml: параметр spawn-limits для monsters уменьши с 70 до 35-50. Monsters: 70 → 40; Animals: 15 → 10; Water-Animals: 5 → 3.
- В paper.yml (или paper-world-defaults.yml) включи: entity-per-chunk-save-limit: monsters: 50, merge-radius для итемов и опыта (настройка merge-radius.exp: 3.0; merge-radius.item: 2.5) — это снижает нагрузку от груды дропа.
- Simulation-distance в server.properties снизь до 4-6 (по умолчанию 10). Это сильнейший рычаг — меньше активных чанков, меньше мобов просчитывается.
- Отключи или ограничь тяжёлые плагины: если Spark показал конкретный плагин, проверь его настройки — почти у всех есть таймеры и частота обновлений.
- Настрой anti-xray в paper.yml — стандартный движок режет TPS. Используй engine-mode: 1 (менее точный, но почти без нагрузки) вместо режима 2.
Что сильнее всего роняет TPS и как это быстро поправить?
- Генерация новых чанков — очень высокая нагрузка, фикс: прегенерация (Chunky)
- Много мобов и энтити — высокая нагрузка, фикс: снизить spawn-limits, simulation-distance
- Тяжёлые плагины — средняя/высокая нагрузка, фикс: аудит через Spark flame graph
- Редстоун и фармы мобов — средняя нагрузка, фикс: лимиты энтити, проверка конкретных мест
- Слабый ЦП (низкая одноядерная частота) — техническое ограничение, фикс: более быстрый VDS
После каждого изменения — снова /spark profiler start --timeout 60, смотришь результат. Оптимизация это итерация, не одноразовая процедура.
Когда оптимизация конфигов не поможет?
Если Spark показывает, что сервер тратит 80%+ времени на «tickEntities» при 20 онлайн игроках и относительно чистом мире — возможно, дело в железе. Minecraft Java Edition однопоточный: важна тактовая частота одного ядра, а не их количество. VDS с 8 ядрами по 2.4 GHz даст хуже TPS, чем VDS с 4 ядрами по 3.8 GHz.
Также проверь версию ядра: Purpur обычно быстрее Spigot и даже Paper за счёт дополнительных оптимизаций. Если ещё на Spigot — переход на Paper/Purpur сам по себе нередко даёт +1-3 TPS без каких-либо настроек.
Millida TradeАвтодонат и автоматическая выдача товаров на сервере — выдача за секунды, без ручной работы.Перейти в TradeЧасто задаваемые вопросы
Какой TPS считается нормальным для Minecraft-сервера?
Норма — ровно 20 TPS. При 19-20 игроки не почувствуют разницы. При 17-18 начнётся лёгкое замедление мира — мобы двигаются чуть медленнее, фармы дают меньше. При 15 и ниже лаги заметны всем: рывки, рассинхронизация блоков, задержки команд. Цель — держать минимум 18-19 под нагрузкой.
Spark не показывает явного виновника — что делать?
Попробуй профилировать дольше: /spark profiler start --timeout 300 (5 минут). Если нагрузка распределена равномерно между многими методами — скорее всего, дело не в конкретном плагине, а в общем количестве мобов или чанков. Снизь simulation-distance и spawn-limits, снова измерь. Также запусти /spark health каждые несколько минут — посмотри, есть ли пики или нагрузка постоянная.
Можно ли смотреть TPS без Spark?
Да. На Paper-серверах есть команда /tps прямо в консоли — она показывает средний TPS за последние 1, 5 и 15 минут. В игре как оператор можно включить TPS-граф через F3 + 2 — он рисует последние 240 тиков на экране. Но Spark всё равно нужен для диагностики: /tps показывает симптом, Spark — причину.
Плагин Chunky — это безопасно для существующего мира?
Да, Chunky только генерирует чанки, которые ещё не существуют, — он не трогает уже созданные части мира. Безопасно запускать на живом сервере, но лучше делать это ночью или в период низкой нагрузки, потому что прегенерация сама по себе временно грузит ЦП и диск.



