Pterohost docs

Spark: профилирование лагов и поиск причин низкого TPS

Как использовать плагин Spark для профилирования Minecraft-сервера, поиска лагов и восстановления нормального TPS. Подробное руководство 2026.

Кратко: Spark - самый точный инструмент для диагностики лагов Minecraft-сервера. Установите плагин, запустите /spark profiler start, воспроизведите лаги, выполните /spark profiler stop и откройте ссылку на flame-граф - там будет видно, что именно жрёт CPU и роняет TPS.

Spark: профилирование лагов и поиск причин низкого TPS

Лаги на Minecraft-сервере - это не абстрактная проблема, а конкретный код, который не успевает отработать за 50 миллисекунд. Именно столько времени отведено на один тик при нормальном TPS 20. Spark позволяет заглянуть внутрь этого процесса и увидеть точные стек-трейсы: какой плагин, какой класс, какой метод занимает больше всего времени. В 2026 году Spark - это стандарт профилирования для Paper, Purpur, Folia и даже Fabric/Forge. Без него диагностика лагов превращается в угадывание.

Pterohost - игровой хостинг с NVMe-дисками, защитой от DDoS и поддержкой 24/7, оптимизированный под Minecraft. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг

Установка Spark

Spark распространяется как плагин (для Bukkit/Spigot/Paper/Purpur) и как мод (Fabric/Forge). Для большинства серверов нужен плагин.

Шаги установки:

  1. Откройте сайт spark.lucko.me и скачайте актуальный .jar для вашей платформы.
  2. Поместите файл в папку plugins/ вашего сервера.
  3. Перезапустите сервер или выполните /reload confirm (но перезапуск предпочтительнее).
  4. Убедитесь, что Spark загрузился: в консоли должна появиться строка вида [Spark] Enabling spark.

Spark не требует конфигурации из коробки. По умолчанию права на команды есть только у операторов (OP). Если нужна интеграция с LuckPerms, добавьте разрешение spark.* нужной группе.

Проверка после установки:

/spark version

Команда выведет версию плагина и информацию о среде выполнения (Java, ядро сервера).

Базовая диагностика: /spark tps и /spark health

Прежде чем запускать профилировщик, стоит оценить общее состояние сервера.

TPS и MSPT

/spark tps

Показывает TPS (Ticks Per Second) за последние 5 секунд, 1 минуту, 5 минут и 15 минут. Нормальное значение - 20.0. Дополнительно Spark выводит MSPT (Milliseconds Per Tick) - сколько миллисекунд в среднем уходит на обработку одного тика.

MSPTTPSСостояние
до 40 мс~20Отличное
40-50 мс18-20Нормальное
50-75 мс13-18Проблемное
75-100 мс10-13Серьёзные лаги
>100 мс<10Критическое

Health-отчёт

/spark health

Комплексный отчёт о состоянии сервера: TPS, MSPT, использование CPU, памяти, информация о GC (сборщике мусора) и потоках. Хорошая отправная точка для первичной диагностики. Отчёт формируется в виде ссылки на spark.lucko.me, где всё удобно отображается в браузере.

Пример вывода /spark health:

TPS: 20.0, 19.8, 19.7 (5s, 1m, 15m)
MSPT: last 5s avg 22.31ms, last 1m avg 23.14ms
CPU: process 8.2% | system 31.4%
Memory: heap 3412MB / 8192MB
GC: G1 Young Gen: 142 collections, 3.21s total time

Профилировщик: /spark profiler

Это основной инструмент Spark. Профилировщик собирает стек-трейсы через равные промежутки времени и строит статистику - сколько раз каждый метод встречался в трейсе.

Запуск и остановка

/spark profiler start

Начинает запись. По умолчанию профилирование идёт по всем потокам.

/spark profiler stop

Останавливает запись и выдаёт ссылку вида https://spark.lucko.me/XXXXXXXX. По этой ссылке открывается интерактивный flame-граф.

Дополнительные параметры

ПараметрОписание
--timeout 60Автоматически остановить через 60 секунд
--thread *Профилировать все потоки (по умолчанию только server thread)
--interval 5Интервал сэмплирования в миллисекундах (по умолчанию 4)
--memoryВключить трекинг аллокаций памяти

Пример с параметрами:

/spark profiler start --timeout 120 --thread *

Запустит профилирование на 2 минуты по всем потокам. Удобно для автоматического сбора данных.

Правила хорошего профилирования

  • Запускайте профилирование именно в момент лагов. Если сервер лагает по вечерам - запустите вечером.
  • Минимальное полезное время профилирования - 30 секунд. Оптимально - 2-5 минут.
  • Не перезапускайте сервер сразу после старта профилирования - дайте ситуации “прогреться”.
  • Если лаги периодические, используйте --timeout с запасом, чтобы поймать момент.

Чтение flame-графа на spark.lucko.me

Flame-граф - это визуализация, где каждый прямоугольник соответствует методу. Ширина прямоугольника пропорциональна доле процессорного времени.

Как ориентироваться

  • Ось X - доля CPU (чем шире, тем больше нагрузка).
  • Ось Y - глубина стека вызовов (снизу вверх: верхний уровень - это то, что вызывает нижний).
  • Цвета - группировка по типу кода (желтый - ваш плагин, синий - Minecraft/Paper, серый - JVM).

Что искать

  1. Откройте ссылку в браузере.
  2. В поле поиска введите название вашего плагина - он подсветится.
  3. Широкие блоки в нижней части стека - это главные виновники.
  4. Кликните на блок, чтобы развернуть и увидеть, что именно он вызывает.

Типичные паттерны проблем:

Что видно во flame-графеВероятная причина
Широкий блок ChunkMap / getChunkМассовая подгрузка чанков
EntityTickList занимает >30%Слишком много энтити (мобы, предметы)
Плагин занимает >10% server threadТяжёлая логика в Scheduler
PluginScheduler с вашим плагиномЗадача в sync-планировщике выполняется слишком часто

Фильтрация по потокам

На странице flame-графа можно переключаться между потоками через выпадающее меню. Server thread - главный игровой поток. Остальные потоки (async tasks, netty) обычно не вызывают TPS-лагов напрямую, но могут влиять на задержку.

Поиск тяжёлых плагинов

Flame-граф показывает плагины по пакетам Java. Если вы видите пакет вида com.example.myplugin с большой долей, это ваш виновник.

Быстрый способ найти плагин

  1. Нажмите Ctrl+F на странице flame-графа.
  2. Введите часть имени плагина или его пакета.
  3. Spark подсветит все вхождения и покажет суммарную долю.

Если не знаете пакет - посмотрите в логах плагина или в его основном классе.

Что делать с тяжёлым плагином

  • Обновите плагин - часто проблема исправлена в новых версиях.
  • Проверьте конфиг - многие плагины имеют настройки частоты тиков, радиусов и лимитов. Например, у плагинов экономики часто есть save-interval - уменьшите частоту сохранения.
  • Отключите ненужные функции - если плагин имеет модули, отключите те, что вы не используете.
  • Замените альтернативой - если плагин занимает 20%+ CPU и не оптимизируется, ищите замену.
  • Сообщите разработчику - откройте issue на GitHub с прикреплённой ссылкой на flame-граф.

Поиск проблем с энтити

Энтити (мобы, предметы, снаряды) - частая причина лагов. Spark позволяет увидеть это через профилирование.

Признаки проблемы с энтити во flame-графе: широкий блок EntityTickList#tick или ServerLevel#tick с высокой долей.

Проверка количества энтити

Используйте стандартные команды Paper/Purpur для диагностики:

/paper entity

Или более детально с разбивкой по чанкам:

/minecraft:kill @e[type=item]

Удаляет все предметы на земле (осторожно на выживальном сервере).

Spark также предоставляет дополнительную информацию в health-отчёте о количестве загруженных чанков и энтити в них.

Настройки лимитов энтити

В paper-world-defaults.yml (Paper 1.21+):

entities:
  spawning:
    count-all-mobs-for-spawning: false
  max-entity-collisions: 2

В spigot.yml:

world-settings:
  default:
    entity-tracking-range:
      players: 48
      animals: 48
      monsters: 48
      misc: 32
      other: 64
    mob-spawn-range: 6

Диагностика памяти: /spark gc и /spark heapsummary

GC (Garbage Collection)

/spark gc

Показывает статистику сборщика мусора Java: сколько раз запускался GC, сколько времени занял, какие поколения объектов очищались.

Признаки проблемы с GC:

  • G1 Old Gen собирается чаще одного раза в несколько минут - утечка памяти.
  • Время одного GC-цикла >500 мс - сервер заметно “тормозит” во время сборки.
  • Heap занят >80% от выделенного - мало RAM или утечка.

Рекомендуемые JVM-флаги для G1GC (Java 17/21):

-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
-Dusing.aikars.flags=https://mcflags.emc.gs
-Daikars.new.flags=true

Heapsummary

/spark heapsummary

Делает снимок кучи и анализирует, какие типы объектов занимают больше всего памяти. Полезно при утечках памяти, когда RAM постепенно растёт без освобождения.

Spark выдаёт ссылку на отчёт, где объекты сортированы по объёму. Ищите неожиданно большое количество объектов от конкретного плагина - это признак утечки.

Пример подозрительного вывода:

[1] dev.somePlugin.cache.PlayerData x 45,000 (312 MB)
[2] org.bukkit.craftbukkit.entity.CraftPlayer x 45,000 (89 MB)

45 000 объектов PlayerData при 50 онлайн-игроках - явная утечка кэша.

Автоматический мониторинг

Spark умеет автоматически собирать данные при снижении TPS ниже порога. Это удобно для серверов с периодическими лагами.

Настройка в plugins/spark/config.json:

{
  "backgroundProfiler": {
    "enabled": true,
    "triggerThreshold": 18.0,
    "logToConsole": true
  }
}

При падении TPS ниже 18 Spark автоматически запустит профилирование и сохранит результат. Путь к файлам: plugins/spark/profiles/.

Для загрузки сохранённого профиля:

/spark profiler open <имя_файла>

Интерпретация результатов: практические сценарии

Сценарий 1: лаги от плагина защиты территорий

Flame-граф показывает, что com.griefprevention занимает 25% server thread. Большая часть уходит на проверку прав при размещении блоков.

Решение: увеличьте кэш проверок в конфиге плагина, если есть такая опция. Проверьте, не выполняется ли синхронно обращение к базе данных.

Сценарий 2: лаги от редстоуна

Flame-граф показывает широкий блок BlockRedstoneWire или RedstoneTorch. Типичная ситуация на техно-серверах.

Решение: установите плагин Alternate Current (доступен как плагин для Paper) - он переписывает логику редстоуна и ускоряет её в 10-100 раз на больших схемах.

Сценарий 3: лаги от чанков

ServerLevel#tick -> ChunkMap#tick -> Chunk#getEntities занимает 40% времени. Одновременно в мире активны 800+ чанков.

Решение: уменьшите view-distance в server.properties (оптимально 8-10 для нагруженных серверов), включите simulation-distance отдельно от view-distance (Paper позволяет это), ограничьте количество игроков или перейдите на более мощный сервер.

Сценарий 4: периодические лаги (spike)

TPS в среднем 20, но каждые 2-3 минуты падает до 5-8 на секунду. Flame-граф во время спайка показывает массивный G1 Old Gen GC.

Решение: увеличьте выделенную память (минимум 4-6 GB для активного сервера), настройте флаги Aikar для G1GC (см. раздел выше), проверьте heapsummary на утечки.

Связанные материалы

Если Spark помог найти проблему, следующий шаг - исправление. Подробно об общих методах оптимизации читайте в статье Оптимизация сервера Minecraft. Если TPS падает из-за конкретных лагов (чанки, энтити, редстоун), разобраться поможет Исправление лагов Minecraft-сервера. Полный список рекомендованных плагинов для производительного сервера собран в Лучшие плагины для Minecraft-сервера.

Заключение

Spark превращает диагностику лагов из угадывания в точную инженерную задачу. Установка занимает 2 минуты, а flame-граф сразу показывает виновника: тяжёлый плагин, переполнение энтити, GC-паузы или проблемный чанк. Начните с /spark health для общей картины, запустите профилировщик в момент лагов, прочитайте граф на spark.lucko.me - и у вас будут конкретные данные для оптимизации. Большинство серверных лагов после одной сессии профилирования решаются за 30 минут. Главное правило - всегда профилировать под реальной нагрузкой: без игроков лагов нет, а значит и flame-граф будет пустым. Включайте Spark именно тогда, когда сервер уже тормозит - только так можно поймать реальный источник проблемы.

Pterohost - Minecraft-хостинг на NVMe с автоматической защитой от DDoS и круглосуточной поддержкой: оптимальная среда для запуска оптимизированного сервера. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг