Когда сервер Minecraft начинает терять плавность, а значение TPS (Ticks Per Second) падает ниже стабильных 20.0, администраторы часто пытаются наугад снижать дальность прорисовки или удалять случайные плагины. Однако для точного устранения лагов требуется объективная диагностика времени выполнения серверного тика. Профайлер Spark — современный отраслевой стандарт мониторинга производительности для серверов Paper, Purpur, Fabric и Forge, пришедший на смену устаревшему инструменту Timings.
В этом руководстве разобран процесс установки Spark, запуск сэмплирования основного потока, анализ отчётов с метрикой MSPT и поиск конкретных источников нагрузки среди мобов, воронок и редстоун-схем.
Почему Spark превосходит устаревший Timings#
Исторический инструмент /timings страдал от двух критических недостатков: он создавал заметный оверхед на процессор во время сбора статистики и группировал данные по грубым категориям Bukkit, не показывая точные стек-трейсы Java.
Преимущества Spark:
- Сэмплирование с нулевым оверхедом: Spark использует встроенные в JVM механизмы профилирования (Async-profiler на Linux), опрашивая стек вызовов через микросекундные интервалы без блокировки тика сервера.
- Фокус на MSPT (Milliseconds Per Tick): TPS — запаздывающий индикатор, который показывает только значение 20.0, пока тик укладывается в 50 миллисекунд. Метрика MSPT отражает реальное время расчёта кадра: если MSPT вырос с 18 мс до 45 мс, сервер всё ещё показывает 20 TPS, но уже находится на грани просадки.
- Глубокий анализ памяти и сборщика мусора (GC): Spark отслеживает генерацию мусора и длительность пауз Stop-The-World, выявляя утечки памяти в плагинах.
Установка плагина Spark и запуск сэмплирования#
Скачайте актуальную версию плагина Spark для платформы Paper/Purpur в директорию plugins/:
cd /opt/minecraft/plugins
wget https://spark.lucko.me/download/bukkit -O spark.jar
Перезапустите сервер или выполните загрузку плагина:
sudo systemctl restart minecraft
sudo journalctl -u minecraft -n 30 --no-pager | grep -i "spark"
Для первичной экспресс-оценки текущего состояния сервера выполните команду в консоли или через чат администратора:
/spark health --memory
Команда выведет мгновенные значения TPS за 5 секунд, 1 минуту и 15 минут, средний и максимальный MSPT, а также распределение памяти в куче (Heap).
Для записи подробного отчёта запустите сэмплирование во время реальной игровой активности игроков:
/spark sampler --timeout 180
Команда запустит профилирование на 3 минуты (180 секунд). По завершении сбора данных Spark сгенерирует безопасную веб-ссылку на интерактивный отчёт.
Чтение отчёта Spark: анализ MSPT и дерева вызовов#
Откройте ссылку в браузере. Главный экран отчёта содержит график MSPT за весь период сбора данных:
- Значения до 40 мс (зелёная зона) означают здоровое состояние сервера с запасом мощности.
- Значения 40–50 мс (жёлтая зона) сигнализируют о повышенной нагрузке.
- Значения более 50 мс (красная зона) фиксируют пропуск тиков и визуальные лаги игроков.
Перейдите во вкладку Call Tree (Дерево вызовов). Основной интерес представляет ветка Server thread:
- Разверните
net.minecraft.server.MinecraftServer.tickServer(). - Найдите блок
net.minecraft.world.level.Level.tick(), отвечающий за обработку конкретных миров (world,world_nether,world_the_end). - Обратите внимание на процент времени: если один мир занимает 85% процессорного времени, проблема локализована в нём.
При использовании панели управления серверами ключевые параметры MSPT и предупреждения о перегрузке тиков собираются автоматически, позволяя выявлять деградацию производительности до жалоб игроков.
Выявление типичных проблем: воронки, сущности и редстоун#
Внутри отчёта Spark легко выделить три самых распространённых источника лагов:
Тикающие сущности (
tickEntities):- Если строка
net.minecraft.world.entity.animal.Villager.tick()занимает более 20% тика, на сервере перегружены фермы жителей. Решение: ограничить количество жителей на чанк черезpaper-world-defaults.yml. - Если много времени уходит на
Entity.move(), проверьте фермы мобов с плотным скоплением сущностей.
- Если строка
Загрузочные воронки (
blockEntities / Hopper):- Постоянный поиск предметов над воронками нагружает процессор. В Spark это отражается как
HopperBlockEntity.tick(). - Решение: включить оптимизированные воронки в
paper-world-defaults.yml:hopper: cooldown-when-full: true disable-move-event: true
- Постоянный поиск предметов над воронками нагружает процессор. В Spark это отражается как
Редстоун и спавн мобов:
- Строка
RedstoneWire.updateSurroundingNeighbors()указывает на массивные чанклоадеры или бесконечные генераторы тактовых импульсов (clock circuits).
- Строка
Мониторинг сборщика мусора и утечек памяти кучи#
Если отчёт показывает резкие скачки MSPT до 200–500 мс каждые несколько секунд, причиной являются паузы сборщика мусора (GC).
Запустите профилирование распределения памяти в куче:
/spark heapsummary
/spark gc
Команда heapsummary покажет классы Java, занимающие наибольший объём RAM. Если миллионы объектов принадлежат стороннему плагину, выявите его и обновите либо отключите. Для оптимизации работы памяти используйте флаги Aikar's Flags с параллельным сборщиком G1GC.




