Гайд Оптимизация сервера: TPS, лаги и что крутить первым

CloudDelight 57 мин. назад 0 ответов 4
#1
Для тех, у кого сервер «лагает», а что именно тормозит, непонятно. Порядок простой: сначала измерить, потом крутить. Без замера можно неделю менять конфиги и так и не попасть в причину.

TPS и MSPT

Сервер обсчитывает мир 20 раз в секунду, это 20 TPS. На один тик отведено 50 миллисекунд. Сколько тик занимает на самом деле, показывает MSPT. Пока MSPT ниже 50, TPS держится на 20 и всё в порядке. Когда тик перестаёт укладываться в 50 мс, TPS падает, и игроки видят лаги: блоки возвращаются, мобы телепортируются, двери открываются с задержкой.

Лаги сервера и низкий FPS у игрока - разные вещи. Если тормозит картинка у одного человека, а у остальных всё плавно, проблема на его стороне.

Шаг 1: spark

spark - профайлер, который показывает, на что уходит время тика. В свежих версиях Paper он встроен, на других ядрах ставится как плагин.
Код
/spark tps
/spark health
/spark profiler start
/spark profiler stop
/spark tps показывает TPS и MSPT, /spark health - нагрузку на процессор и память. Профайлер запускайте, когда лагает, и держите несколько минут. После stop spark даст ссылку на отчёт в браузере. Разворачивайте Server thread и смотрите, что съедает больше всего: конкретный плагин, тики сущностей, загрузка чанков, хопперы.

Если лаги не постоянные, а пиками, запустите профайлер с флагом --only-ticks-over 100: в отчёт попадут только тики длиннее 100 мс.

Шаг 2: дальность прорисовки и симуляции

В server.properties есть два ключа, которые сильнее всего влияют на нагрузку:
  • view-distance - сколько чанков вокруг игрока отправляется ему для отображения;
  • simulation-distance - в каком радиусе мир живёт: растут растения, двигаются мобы, работают механизмы.
По умолчанию оба равны 10. Для большинства выживаний хватает view-distance 6-8 и simulation-distance 4-6. Число обрабатываемых чанков растёт с квадратом радиуса, так что разница между 10 и 6 большая. Минус маленькой симуляции: фермы работают, только когда игрок рядом.

Шаг 3: предгенерация мира

Генерация новых чанков - одна из самых тяжёлых операций. Когда игроки бегут по нетронутой карте или летают на элитрах, сервер генерирует мир на лету, и TPS проседает. Решение: сгенерировать мир заранее плагином Chunky и ограничить его границей.
Код
/chunky world world
/chunky center 0 0
/chunky radius 5000
/chunky start
/worldborder center 0 0
/worldborder set 10000
У /worldborder set указывается диаметр, поэтому радиусу 5000 соответствует 10000. Генерация идёт долго, запускайте её до открытия или ночью на пустом сервере. Ад и Энд тоже стоит прогнать. Процесс можно приостановить командой /chunky pause и продолжить /chunky continue.

Шаг 4: сущности и фермы

В отчёте spark часто на первом месте сущности: стада животных, фермы жителей, тысячи предметов на земле, хопперы.
  • Лимиты спавна мобов задаются в bukkit.yml, блок spawn-limits.
  • В spigot.yml есть entity-activation-range: мобы дальше этого радиуса обрабатываются реже.
  • В paper-world-defaults.yml много настроек для сущностей, предметов и хопперов, например лимит определённых сущностей, которые сохраняются в чанке.
  • Жители - отдельная боль. В Purpur есть опция, которая упрощает поведение жителей, запертых в торговых ячейках.
  • Ограничение животных на чанк ставьте плагином и пишите о нём в правилах заранее, а не после того, как у игрока исчезло стадо.
Плагины, которые раз в несколько минут чистят все предметы с земли, - костыль. Лучше найти, что именно плодит сущности.

Шаг 5: запуск и память

Больше памяти не значит быстрее. Ставьте -Xms и -Xmx одинаковыми и оставляйте запас системе: ОС, база данных и прокси тоже хотят память. В панелях хостинга лимит контейнера должен быть выше -Xmx: Java тратит память и сверх хипа, и при лимите впритык процесс могут убить без понятной ошибки в логе.

Для запуска используйте флаги Aikar, это проверенный набор настроек сборщика мусора G1 под Paper.
Флаги Aikar, пример для 10 ГБ
Код
java -Xms10G -Xmx10G -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 -jar paper.jar --nogui
Если выделяете больше 12 ГБ, меняются пять значений: G1NewSizePercent=40, G1MaxNewSizePercent=50, G1HeapRegionSize=16M, G1ReservePercent=15, InitiatingHeapOccupancyPercent=20.

Шаг 6: железо

Основной тик Paper считается в одном потоке, поэтому важна скорость одного ядра, а не количество ядер. Дешёвый VPS с восемью слабыми ядрами нередко проигрывает машине с четырьмя быстрыми. При выборе хостинга смотрите на модель и частоту процессора, NVMe-диски и расположение дата-центра поближе к игрокам. Если хостинг не называет модель процессора, это повод насторожиться.

Чего не делать

  • Не используйте /reload, перезапускайте сервер целиком. После reload плагины текут памятью и ведут себя непредсказуемо.
  • Не ставьте «оптимизирующие» плагины вслепую, не посмотрев в spark, что тормозит.
  • Не меняйте десять настроек сразу. Одна правка, замер, следующая правка.

Вопросы по теме — пишите ниже, ответим.

Чтобы ответить, войдите или зарегистрируйтесь.

Регистрация — минута, без подтверждения почты.

Регистрация Вход