RE:NODE

Руководства11 мин чтения

Производительность сервера Rust: сущности и FPS

Как читать частоту кадров и число сущностей сервера Rust, найти, что их тянет вниз - базы, плагины, сборка мусора, размер карты, - и убрать лаги без гаданий.

0 прочтений

Здоровье сервера Rust описывается одним числом: его частотой кадров, то есть количеством тиков симуляции, которые он завершает за секунду. Когда она падает, двери открываются с опозданием, игроков откидывает назад, а бои кажутся нечестными. Сильнее всего её тянет вниз число сущностей - каждая стена, ящик, турель, спящий игрок и выброшенный предмет, которые отслеживает сервер, - и оно растёт со дня вайпа до следующего вайпа. Дальше идут плагины, паузы сборки мусора и размер карты. Исправления по степени пользы: держать decay включённым, подобрать размер карты под онлайн, проверить плагины по времени хуков, дать сборщику мусора запас, перезапускаться ежедневно и вайпать по расписанию. Если сначала измерить всё через serverinfo, гадание превращается в чек-лист.

Измерьте, прежде чем что-то менять#

Две консольные команды говорят большую часть того, что нужно.

code
> server.fps> serverinfo{  "Hostname": "Longship | EU | Biweekly",  "MaxPlayers": 75, "Players": 61, "Queued": 0, "Joining": 1,  "EntityCount": 184213,  "Framerate": 58.0,  "Memory": 11240,  "Collections": 312,  "NetworkIn": 412000, "NetworkOut": 3950000,  "Uptime": 51320}
ПолеЗначениеНа что смотреть
FramerateТики сервера в секунду прямо сейчасУстойчивые просадки, а не единичные провалы
EntityCountОбъекты, которые отслеживает серверТренд на протяжении вайпа
MemoryУправляемая память в МБРост с аптаймом
CollectionsСборки мусора с момента запускаКак быстро растёт
Players, QueuedОнлайнСледуют ли лаги за онлайном или за сущностями

serverinfo - тот же вызов, которым пользуются боты статуса и RCON-инструменты, так что его можно логировать каждые несколько минут и видеть кривую целого вайпа. В статье о RCON и WebRCON в Rust есть короткий скрипт для этого. Один замер говорит мало; неделя замеров показывает, следуют ли лаги за числом игроков, числом сущностей или аптаймом, и у каждого случая своё лечение.

Что значит FPS сервера и какой он должен быть#

Сервер выполняет симуляцию в цикле, и Framerate - это сколько раз в секунду этот цикл завершается. Это не частота кадров графики у игроков, и сервер на 30 может ощущаться совершенно плавным, тогда как клиент на 30 - нет.

FPS сервераЧто замечают игроки
60 и вышеНичего; это комфортный запас
30-60Обычно всё в порядке; просадки во время рейдов терпимы
15-30Заметные задержки у дверей, лутания, строительства
Ниже 15Откаты, рассинхрон, громкие жалобы игроков

Это примерные диапазоны, а не правила - тихий PvE-сервер на 25 чувствует себя лучше, чем загруженный PvP-сервер на 40 с провалами до 5. Провалы важнее средних значений: сервер, у которого в среднем 50, но каждые несколько минут он проседает до однозначных чисел, ощущается хуже, чем стабильные 30.

Сервер ограничивает себя значением fps.limit. Поднятие потолка не создаёт производительности, которой нет. Опустить его примерно до 60 на общей машине разумно, потому что такты, потраченные сверх этого, игрокам ничего не дают и отнимаются у соседей. Общая концепция разобрана в статье о том, что на самом деле значит tick rate.

Сущности: главная статья расходов#

Почти всё в Rust, что не является рельефом, - это сущность: строительные блоки, двери, ящики, печи, турели, спальники, спящие игроки, выброшенные предметы, трупы, животные, NPC, транспорт, ресурсные узлы. Каждая стоит памяти, а многие стоят CPU в каждом тике - всё, что думает, движется, разрушается или проверяет, нет ли рядом игроков.

На свежей процедурной карте число сущностей - это в основном окружение и монументы. Потом игроки начинают строить. Загруженный community-сервер может добавлять десятки тысяч сущностей в неделю, и сервер, который начал вайп с комфортной частотой кадров, заканчивает его с трудом - на том же железе и с тем же числом игроков. Сбрасывает это только вайп.

Что двигает рост сущностей, примерно по порядку:

  • Базы. Большие комплексы из сотен блоков, с внешними стенами и десятками ящиков. Кланы строят больше, чем соло.
  • Установленные предметы. Каждый ящик, печь, грядка, табличка, светильник и ловушка.
  • Брошенные базы. Без decay они никуда не деваются.
  • Электрические и промышленные установки. Конвейеры, сортировщики и проводные системы - это сущности, которые ещё и выполняют работу в каждом тике.
  • Выброшенные предметы и трупы после боёв, пока не исчезнут.
  • Игроки, спящие на своих базах, которые остаются сущностями, пока они не в сети.

Как сдерживать рост сущностей#

  • Держите decay и upkeep включёнными. Ванильный decay убирает брошенные базы за день-два; upkeep делает содержание гигантских баз дорогим. decay.scale 0 на месячном сервере - самый надёжный способ сделать последнюю неделю неиграбельной. Настройки decay объясняются в статье о server.cfg и convar-ах.
  • Подбирайте размер карты под онлайн. Большая карта даёт игрокам больше места для строительства и больше монументов, полных NPC. Таблица по онлайну есть в статье о кастомных картах и размере процедурной карты.
  • Вайпайте достаточно часто. Если производительность рушится на третьей неделе, двухнедельный цикл решает это чище любого плагина. Как вписать периодичность вокруг принудительного обновления, разобрано в статье о графике ежемесячного принудительного вайпа.
  • Ограничьте, сколько может поставить одна группа. Плагины лимитов строительства ограничивают число блоков или конкретных установленных предметов на игрока или на Tool Cupboard. На модовом сервере с высокими рейтами добычи они почти обязательны, потому что 5x ресурсов дают 5x баз.
  • Разбирайтесь с худшими нарушителями напрямую. Админ с debugcamera может найти комплекс, который в десять раз больше всего остального. Поговорить с его владельцами обычно эффективнее, чем ввести правило, которого никто не читает.

Плагины очистки, которые периодически удаляют сущности по таймеру, - крайняя мера. Они лечат симптом и удаляют то, что игрокам дорого, в моменты, которые они не простят.

Как найти дорогие базы

Сущности распределены неравномерно. На большинстве серверов несколько групп отвечают за большую долю всего построенного, и один разросшийся комплекс с внешними стенами, десятками ящиков и автоматизированной промышленной установкой может стоить больше, чем двадцать самых маленьких баз вместе взятых.

Найти их - задача для админа с debugcamera или noclip на один вечер. Пролетите над картой на высоте, отметьте крупнейшие комплексы и самые плотные скопления установленных предметов и загляните внутрь тех, где есть проводная электрика и конвейеры, которые тоже работают в каждом тике. На модовом сервере это ускоряют плагины админского радара, потому что показывают ящики и установленные предметы сквозь стены.

Что делать с этим списком - решение сообщества, а не техническое. Многие серверы публикуют лимиты в правилах - максимальную площадь, ограничение на турели или внешние стены - и применяют их плагином лимитов строительства, чтобы никому не приходилось спорить в каждом отдельном случае. Другие говорят с крупнейшими группами напрямую и просят убрать брошенные части. И то и другое работает лучше, чем удаление чего-либо без предупреждения. Инструменты осмотра разобраны в статье об админских командах Rust.

Плагины и время хуков#

На модовом сервере плагины - вторая по величине статья расходов и самая лёгкая для исправления, потому что затраты обычно сосредоточены. Большинство плагинов делает немного работы на нескольких событиях. Несколько делают много работы на событиях, которые срабатывают постоянно, - каждый спавн сущности, каждый тик урона, каждое перемещение предмета, - и эти несколько могут стоить больше всего остального вместе.

В Oxide oxide.plugins выводит каждый плагин с суммарным временем, проведённым в его хуках. Отсортируйте по этому времени после загруженного вечера. В Carbon встроенный профайлер записывает хуки и плагины в выбранное вами окно - это более надёжное доказательство. Что обычно оказывается наверху:

  • UI-плагины, которые перерисовывают интерфейс для каждого игрока по короткому таймеру.
  • Всё, что периодически перебирает все сущности.
  • Плагины логирования, которые пишут при каждом событии урона или лутания.
  • Два плагина, делающие одну работу и цепляющиеся за одни и те же события.

Выгрузите подозреваемый плагин тихим вечером и сравните частоту кадров следующим вечером при том же онлайне. Команды разобраны в статьях о плагинах Oxide (uMod) и Carbon или Oxide.

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

Rust - игра на Unity, и её игровой код работает в управляемой среде со сборщиком мусора. Сервер создаёт и выбрасывает объекты, мусор накапливается, и сборка останавливает работу, чтобы освободить память. Частые сборки проявляются как регулярные подтормаживания - частота кадров ненадолго проседает и восстанавливается, - а Collections в serverinfo быстро растёт.

Rust предоставляет gc.buffer - объём запаса (в МБ), который сборщик держит перед сборкой. Больший буфер означает меньше сборок, но крупнее, ценой большего потребления памяти. На сервере со свободной памятью его увеличение - частое и эффективное изменение; в серверных гайдах обычно используют значения в пределах нескольких тысяч мегабайт. Задайте его в строке запуска, проверьте через find gc., какие convar-ы есть в вашей сборке, и после этого следите и за подтормаживаниями, и за общей памятью. Увеличение буфера на сервере, который и так близок к пределу памяти, меняет подтормаживания на остановку из-за нехватки памяти, а это хуже.

Память растёт и с аптаймом, и с числом сущностей. Отсюда два правила:

  1. Рассчитывайте память на конец вайпа, а не на начало. Серверу, которому в первый день хватает 9 ГБ, к двадцатому дню может понадобиться 14 ГБ.
  2. На загруженных серверах перезапускайтесь ежедневно. Плановый перезапуск в тихий час, объявленный заранее, возвращает память и очищает накопившееся состояние. Как сделать это, никого не раздражая, объясняет статья о расписаниях перезапуска, которые помогают.
code
say "Server restart in 10 minutes - find a safe spot"server.saverestart 600 "Daily restart"

CPU, игроки и главный поток#

Симуляция опирается на один главный поток. Больше ядер помогает с сохранением, сетью и компиляцией плагинов, но частоту кадров определяет то, насколько быстро одно ядро справляется с работой. Поэтому сервер с восемью медленными ядрами может лагать там, где сервер с четырьмя быстрыми не лагает, и поэтому при выборе железа сравнивать нужно скорость на ядро. Общая версия этого аргумента - в статье CPU или RAM для игровых серверов.

Игроки стоят CPU пропорционально тому, что они делают рядом друг с другом. Пятьдесят игроков, разбросанных по карте, дешевле, чем пятьдесят в одном рейде, и пик лагов обычно приходится на вечерний рейд на крупнейшую базу. Очередь вас защищает: выставить server.maxplayers на то, что сервер способен выдержать, и дать остальным подождать лучше, чем впустить всех и лагать для каждого.

NPC, животные и события

Не все затраты CPU связаны с игроками. Учёные на монументах, животные, бродящие по карте, патрульный вертолёт, грузовой корабль и другие события по расписанию думают и двигаются на сервере, и их стоимость растёт вместе с картой: в большем мире больше монументов и больше площади для спавна, а значит, и их больше. Чаще всего это ровная фоновая нагрузка, а не проблема, но она объясняет, почему пустая большая карта всё равно заметно грузит CPU и почему плагины событий, добавляющие лишних NPC, рейдовые базы или более частые события, - одни из самых дорогих вещей, которые можно установить.

Если добавляете такой контент, добавляйте по одному элементу и сравнивайте частоту кадров при похожем онлайне до и после. Стоимость плагина рейдовых баз, который спавнит десятки вооружённых NPC, сильно отличается в тихий вторник и в субботний вечер, когда онлайн все группы.

На хостинге, который ограничивает CPU долей, как это делают панели на контейнерах, лимит - жёсткий потолок: при 100% вашей доли сервер работает медленно, а не приостанавливается. В RE:NODE CPU жёстко ограничивается купленной долей, а графики в консоли показывают память, CPU и диск относительно лимитов тарифа, так что видно, упала ли частота кадров потому, что исчерпана доля CPU, или по другой причине. Как их читать, объясняет статья о графике нагрузки сервера.

Таблица диагностики#

СимптомВероятная причинаЧто попробовать первым
Лаги усиливаются в течение вайпаРост сущностейПроверить decay; подумать о более коротком цикле
Регулярные короткие подтормаживанияСборка мусораУвеличить gc.buffer, если хватает памяти
Лаги только при пиковом онлайнеCPU на пределеУменьшить server.maxplayers или добавить CPU
Лаги после добавления плагинаСтоимость хуков плагинаПроверить время хуков; выгрузить и сравнить
Лаги возле одного местаОгромная база или промышленная установкаНайти её через debugcamera
Перезапуски без ошибкиДостигнут лимит памятиРассчитывать на конец вайпа; перезапускать ежедневно
Лаги сразу после перезапускаЗагрузка мира, игроки заходят обратноПодождать несколько минут, прежде чем делать выводы

Когда сервер постоянно перезапускается#

Сервер Rust, превысивший лимит памяти, останавливается. В RE:NODE контейнер, упёршийся в лимит памяти, останавливается ядром и чисто перезапускается, а не уходит в swap, поэтому симптом - перезапуск без чего-либо полезного в логе игры, а всё с момента последнего сохранения теряется. Наблюдатель за крашами считает незапланированные перезапуски; три за час дают предупреждение на странице сервера и автоматический тикет. Если вы видите именно это, причина почти всегда в росте памяти в течение вайпа, а лечение - то, что описано выше: decay, размер карты, ежедневный перезапуск и достаточно памяти для последнего дня. Уменьшение server.saveinterval снижает цену каждого перезапуска. Остальные причины разобраны в статье о том, почему ваш игровой сервер постоянно перезапускается.

FAQ#

Какой FPS сервера считается хорошим для Rust?

Устойчиво выше 30 - в целом нормально, а 60 - комфортный запас. Сильнее всего игроки замечают провалы - сервер, который каждые несколько минут падает до однозначных чисел, ощущается хуже, чем стабильно держащий 30.

Сколько сущностей - это слишком много для сервера Rust?

Фиксированного числа нет; всё зависит от CPU, плагинов и того, что это за сущности. Следите за трендом: если частота кадров падает по мере роста EntityCount в течение вайпа, на этом железе ваш предел - сущности.

Вызывает ли большая карта больше лагов?

Косвенно. На большой карте больше рельефа, больше монументов и NPC, и у игроков больше места для баз. Если размер соответствует онлайну, всё нормально; если карта велика, она тратит память и CPU на пустое пространство.

Нужно ли перезапускать сервер Rust каждый день?

На загруженном сервере - да. Ежедневный перезапуск в тихий час убирает рост памяти и накопившееся состояние. Объявляйте его, сначала сохраняйтесь и держите одно и то же время каждый день.

Помогают ли Rust плагины очистки в духе ClearLag?

Редко, и они раздражают игроков. Decay, upkeep, лимиты строительства и разумная периодичность вайпов контролируют сущности у источника; удаление по таймеру - крайняя мера.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000