DGuard

Профайлер spark: как найти, что тормозит сервер

spark — профайлер для серверов Minecraft: он показывает, на что уходит время тика, какой плагин сколько тратит, как ведут себя память и сборщик мусора. В Paper 1.21 и новее он уже встроен. Разбираем команды, флаги и то, как читать отчёт.

Команда DGuard6 мин

Коротко: дождитесь лагов и выполните /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 tpsTPS, время тиков и загрузка процессора — подробно в статье TPS и MSPT
/spark healthотчёт о здоровье: TPS, процессор, память, диск; в браузере обновляется каждые 10 секунд
/spark tickmonitorпишет в чат о тиках, которые заметно дольше среднего
/spark gc / gcmonitorистория сборок мусора / включить или выключить наблюдение за сборками
/spark heapsummaryсводка кучи: какие классы занимают память
/spark heapdumpполный снимок кучи в файл .hprof на диске
/spark pingпинг игроков: средний или конкретного игрока через --player
По документации spark (Command Usage)

Профайлер и его флаги

ФлагЧто даёт
--timeout <секунды>сам остановится и пришлёт ссылку; 600 — 10 минут, как советует Paper
--only-ticks-over <мс>записывает только тики дольше заданного — для поиска фризов
--thread *все потоки, а не только основной: так видно работу сетевых потоков и плагинов в своих потоках
--allocпрофилирует выделение памяти вместо процессора
--interval <мс>частота выборок, по умолчанию 4 мс
stop --comment <текст>подпись, которая появится в отчёте
stop --save-to-fileсохранить профиль в файл в папке настроек spark вместо загрузки на сайт
По документации spark (Command Usage)
Типичные сценарии
/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. 1

    Поймайте фриз

    /spark tickmonitor --threshold-tick 50 сообщит о каждом тике дольше 50 мс — с этого момента сервер начинает отставать. Без флагов монитор сообщает о тиках вдвое дольше среднего.

  2. 2

    Оцените длительность

    Посмотрите, сколько длятся лаговые тики, и сопоставьте время с тем, что происходило в игре.

  3. 3

    Снимите профиль только фризов

    /spark profiler start --only-ticks-over 100. Порог должен быть ниже длительности лаговых тиков; spark советует значение от 50 до 100 мс.

Как читать отчёт

  1. 1

    Выберите поток

    Вверху — список потоков. Главный — «Server thread»: он считает тик. Поток всегда показан как 100 %, ниже — доли его времени.

  2. 2

    Отделите сон от работы

    Время в ожидании следующего тика (waitForNextTick, sleep) — это хорошо: у сервера есть запас. По документации spark, меньше 20 % сна — сервер работает на пределе, меньше 5 % — почти наверняка лагает.

  3. 3

    Идите по процентам

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

  4. 4

    Включите «Sources»

    Вид «Sources» строит отдельное дерево для каждого плагина: сразу видно, какой плагин сколько забирает у тика.

Вид или функцияЗачем
Allвид по умолчанию: всё дерево вызовов
Flat250 самых медленных вызовов списком; сортировка по полному или собственному времени метода
Sourcesдерево по плагинам и модам — главный вид для поиска виновного плагина
Flame graphширина блока — доля времени; правый клик по узлу → «View as Flame Graph»
Маппингирасшифровывают имена классов Minecraft; выбираются автоматически, вручную — в меню справа вверху
ЗакладкиAlt+клик по вызову подсвечивает его и добавляет в ссылку — удобно показать место разработчику
По документации spark (Using the viewer)

Память и сборка мусора

/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 предпочтительным способом профилирования.

Источники

Все разделы
Оптимизация7 минTPS и MSPT: что значат и какие цифры нормальныеTPS — сколько тиков сервер успевает за секунду, MSPT — сколько миллисекунд длится тик. Норма — 20 TPS, а для неё каждый тик должен укладываться в 50 мс. Разбираем, где смотреть эти цифры, какие значения тревожные и что происходит, когда сервер не успевает.ЧитатьОптимизация6 минПочему лагает сервер Minecraft и как найти причинуСначала поймите, что лагает: сервер (низкий TPS), сеть (пинг) или компьютер игрока (FPS). Если сервер — измерьте MSPT и снимите профиль spark: он покажет, что съедает 50 мс тика.ЧитатьОптимизация6 минСколько ресурсов ест античит и как это проверитьАнтичит почти не нагружает сервер, если проверяет пакеты в сетевых потоках, и заметно отнимает тик, если работает в основном потоке. Проверить это можно за 10 минут профайлером spark — не веря никому на слово.Читать

Поставьте лучший античит для современного Minecraft

DGuard ловит все 47 видов читов из нашего сравнения — у ближайшего соперника, Intave, 27. Полная защита на любом тарифе, до 30 игроков онлайн — бесплатно.