Коротко: дождитесь лагов и выполните /spark profiler start --timeout 600. Через 10 минут spark пришлёт ссылку на отчёт. В нём откройте поток «Server thread» и идите по самым большим процентам, а вид «Sources» покажет отдельное дерево для каждого плагина. Для редких фризов добавьте --only-ticks-over 100 — в отчёт попадут только тики дольше 100 мс.
Установка: на Paper уже есть
Начиная с 1.21 Paper поставляется со встроенным spark, ставить jar не нужно — команда /spark работает сразу. Им управляет раздел spark в config/paper-global.yml: enabled: true включает встроенный spark, а enable-immediately: false значит, что он запускается после строки Done в консоли. Чтобы профилировать сам запуск сервера, поставьте enable-immediately: true.
- Нужна версия новее встроенной. Положите jar spark в
plugins/и добавьте в команду запуска-Dpaper.preferSparkPlugin=true. - Другие серверы. Скачайте jar со страницы загрузок spark и положите в папку
pluginsилиmods, затем перезапустите сервер. - Прокси. На Velocity команда —
/sparkv, на BungeeCord —/sparkb. - Права. Общее право
sparkили отдельные:spark.profiler,spark.health,spark.tps,spark.gc,spark.heapsummary. Операторам доступно и так.
Главные команды
| Команда | Что делает |
|---|---|
/spark profiler start | запускает профайлер |
/spark profiler stop | останавливает и выдаёт ссылку на отчёт |
/spark profiler open | открывает отчёт, не останавливая профайлер |
/spark profiler info / cancel | состояние профайлера / остановить без загрузки отчёта |
/spark tps | TPS, время тиков и загрузка процессора — подробно в статье TPS и MSPT |
/spark health | отчёт о здоровье: TPS, процессор, память, диск; в браузере обновляется каждые 10 секунд |
/spark tickmonitor | пишет в чат о тиках, которые заметно дольше среднего |
/spark gc / gcmonitor | история сборок мусора / включить или выключить наблюдение за сборками |
/spark heapsummary | сводка кучи: какие классы занимают память |
/spark heapdump | полный снимок кучи в файл .hprof на диске |
/spark ping | пинг игроков: средний или конкретного игрока через --player |
Профайлер и его флаги
| Флаг | Что даёт |
|---|---|
--timeout <секунды> | сам остановится и пришлёт ссылку; 600 — 10 минут, как советует Paper |
--only-ticks-over <мс> | записывает только тики дольше заданного — для поиска фризов |
--thread * | все потоки, а не только основной: так видно работу сетевых потоков и плагинов в своих потоках |
--alloc | профилирует выделение памяти вместо процессора |
--interval <мс> | частота выборок, по умолчанию 4 мс |
stop --comment <текст> | подпись, которая появится в отчёте |
stop --save-to-file | сохранить профиль в файл в папке настроек spark вместо загрузки на сайт |
/spark profiler start --timeout 600
/spark profiler start --only-ticks-over 100 --timeout 600
/spark profiler start --thread * --timeout 600
/spark profiler openПрофиль полезен, только пока проблема происходит: так пишет и документация Paper. Снимайте его в пиковый онлайн или когда игроки жалуются, а не на пустом сервере. На Linux и macOS (x86_64 и arm64) spark использует движок async-profiler — он точнее Java-сэмплера. В контейнерах вроде Pterodactyl ему может понадобиться пакет libstdc++.
Редкие фризы: tickmonitor и --only-ticks-over
Обычный профиль усредняет данные: один тик на 300 мс тонет среди тысяч нормальных. Документация spark предлагает двухшаговый способ.
- 1
Поймайте фриз
/spark tickmonitor --threshold-tick 50сообщит о каждом тике дольше 50 мс — с этого момента сервер начинает отставать. Без флагов монитор сообщает о тиках вдвое дольше среднего. - 2
Оцените длительность
Посмотрите, сколько длятся лаговые тики, и сопоставьте время с тем, что происходило в игре.
- 3
Снимите профиль только фризов
/spark profiler start --only-ticks-over 100. Порог должен быть ниже длительности лаговых тиков; spark советует значение от 50 до 100 мс.
Как читать отчёт
- 1
Выберите поток
Вверху — список потоков. Главный — «Server thread»: он считает тик. Поток всегда показан как 100 %, ниже — доли его времени.
- 2
Отделите сон от работы
Время в ожидании следующего тика (
waitForNextTick,sleep) — это хорошо: у сервера есть запас. По документации spark, меньше 20 % сна — сервер работает на пределе, меньше 5 % — почти наверняка лагает. - 3
Идите по процентам
Раскрывайте узлы с наибольшей долей: тик миров, сущности, задачи планировщика плагинов. Время в миллисекундах видно при наведении.
- 4
Включите «Sources»
Вид «Sources» строит отдельное дерево для каждого плагина: сразу видно, какой плагин сколько забирает у тика.
| Вид или функция | Зачем |
|---|---|
| All | вид по умолчанию: всё дерево вызовов |
| Flat | 250 самых медленных вызовов списком; сортировка по полному или собственному времени метода |
| Sources | дерево по плагинам и модам — главный вид для поиска виновного плагина |
| Flame graph | ширина блока — доля времени; правый клик по узлу → «View as Flame Graph» |
| Маппинги | расшифровывают имена классов Minecraft; выбираются автоматически, вручную — в меню справа вверху |
| Закладки | Alt+клик по вызову подсвечивает его и добавляет в ссылку — удобно показать место разработчику |
Память и сборка мусора
/spark health show --memory выводит в консоль подробности о памяти JVM, /spark gc — историю сборок мусора. Если память растёт и не освобождается, /spark heapsummary покажет, какие классы занимают кучу: по именам пакетов обычно видно, чей это плагин. /spark heapdump пишет полный снимок .hprof — он большой, держите место на диске. Сколько памяти давать серверу — в статье сколько RAM нужно, какие флаги ставить сборщику — в статье флаги JVM.
Как поделиться отчётом
Ссылку на отчёт можно свободно отправить разработчику плагина или в поддержку: документация Paper просит приносить отчёт spark в канал #paper-help своего Discord. Если не хотите загружать профиль на сайт spark, остановите профайлер с --save-to-file. А готовый список того, что обычно оказывается причиной лагов, — в статьях почему лагает сервер и оптимизация Paper.
Проверьте античит в профиле
Профиль spark — честный способ проверить любой плагин, в том числе античит: найдите его в виде «Sources» и посмотрите долю в «Server thread». DGuard — лучший античит для современного сервера Minecraft — считает проверки в сетевых потоках, поэтому на основном потоке он занимает 0,03 % одного ядра. Работу в сетевых потоках покажет профиль с --thread *, а время самих проверок — команда /dguard perf. Как сравнить два античита на одном сервере — в статье нагрузка античита.
Частые вопросы
Нужно ли ставить spark на Paper?
Нет. Начиная с 1.21 Paper поставляется со встроенным spark, команда /spark работает сразу. Отдельный jar нужен, только если хотите версию новее встроенной, — тогда добавьте -Dpaper.preferSparkPlugin=true.
Как долго снимать профиль?
Документация Paper советует 10 минут: /spark profiler start --timeout 600. Главное — чтобы лаги происходили во время записи.
Как найти плагин, который лагает?
Откройте отчёт, выберите «Server thread» и включите вид «Sources»: у каждого плагина будет своё дерево с долей времени тика.
Как поймать редкие фризы?
Включите /spark tickmonitor --threshold-tick 50, чтобы увидеть длинные тики, а затем снимите профиль с --only-ticks-over и порогом ниже их длительности, например 100 мс.
Чем spark лучше timings?
Timings в Paper устарел: он не поддерживается годами и с 1.21 выключен по умолчанию. Документация Paper называет spark предпочтительным способом профилирования.
Источники
- spark: установка
- spark: команды
- spark: как читать отчёт
- spark: поиск фризов
- spark: цикл тиков
- spark: настройки (фоновый профайлер)
- spark: движок async-profiler
- Paper: Profiling
- Paper: paper-global.yml (раздел spark)
- DGuard — лучший античит для современного сервера Minecraft: сравнение проверок с GrimAC, Vulcan, Polar, Intave и Matrix
- DGuard: установка, требования и решение проблем
- DGuard: поддерживаемые версии Paper и Leaf