Rust news
SOCIAL:
Filed under: Гайды Rust

Гайд — Производительность сервера Rust

Гайд - Производительность сервера Rust

Огромное спасибо Алистеру (Facepunch), Вульфу (Oxide) и Тирану (Rustoria) за то, что они ответили на вопросы и оставили комментарии к статье.

Данное руководство предназначено в основном для владельцев крупных публичных серверов, рассчитанных на большое количество игроков (более 100), где производительность особенно важна.

У каждого владельца сервера есть несколько основных задач:

  • Минимизировать время простоя сервера (сбои/отсутствие отклика, DDOS-атаки)
  • Наработать базу игроков
  • Постоянно стремиться к тому, чтобы сервер работал с максимальной производительностью, и чтобы все принятые вами решения касательно аппаратной части и настроек были оптимальными.

Здесь мы сосредоточимся на последнем пункте – производительности сервера.

Первоначальные соображения

 

Серверное оборудование

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

Если это возможно, лучше выделить под Rust отдельные ядра с хорошей скоростью работы. Файл RustDedicated.exe (исполняемый файл сервера) в значительной степени связан с одним или двумя ядрами – поэтому необходимо, чтобы ядра были максимально быстрыми.

В компании Facepunch считают, что скорость жёсткого диска имеет значение как для времени загрузки сервера, так и для производительности в целом. То есть, если это возможно, выбирайте сервер с SSD.

Производительность Rust изменяется

Производительность файла RustDedicated.exe изменяется с каждым новым патчем. Иногда Facepunch сосредотачивается на вопросах оптимизации серверов. Это позволяет заметно повысить производительность, но, как правило, со временем она ухудшается.

Количество игроков

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

Когда сразу много игроков занимается строительством (особенно в случае с большими базами) или разрушением баз, серверу приходится много работать, что вредит производительности RustDedicated.exe.

Сущности и коллайдеры

Чем больше вещей (сущностей) существует в игровом мире, тем больше нагрузка на сервер.

Сущность – это созданная Facepunch концепция, которая представляет собой объект сетевой игры, существующий в мире Rust.  В их число входят стены, двери, печи, рудные материалы, деревья, животные, кодовые замки, спальные мешки и инструменты.  В общем, это все предметы, которые вы используете или создаёте в Rust.  У каждой сущности может быть один или несколько коллайдеров (поэтому механизм выявления конфликтов также имеется).  В игре нет жёстких ограничений по количеству сущностей.  В ней есть “лимит коллайдеров”, причиной чего является баг в unity/physx.  Поэтому в настоящее время коллайдеры в Rust пакетируются так, чтобы лимита нельзя было достигнуть.

 

Игроки создают сущности, когда строят базы. А некоторые сущности изначально существуют в игровом мире (например, деревья), и их количество растёт вместе с размером карты.

По мере увеличения числа сущностей и коллайдеров, производительность сервера падает. Хотя нет жёсткого лимита для сущностей, вам следует поддерживать их количество на уровне, где производительность сервера остаётся приемлемой. Подробности ниже.

Производительность сети

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

Большинство игроков не имеет понятия, что задержки (лаги) обычно бывают связаны с сетью – и, как правило, на их конце.  Однако если задержки постоянно появляются у всех игроков, то это либо это более масштабные неполадки с сетью (у сервера или датацентра), либо проблемы с производительностью.

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

Модифицированные серверы (Oxide)

Работа Oxide не влияет на производительность сервера. Но вы не станете запускать Oxide, если не собираетесь подключать расширения и плагины, и именно они могут оказывают влияние на производительность.

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

Как оценивается производительность?

 

Отзывчивость сервера

Если сервер работает недостаточно хорошо, такие действия, как открытие дверей и ящиков будут занимать больше времени, чем хотелось бы, игра против других игроков (PVP) будет казаться нелогичной, размещение деталей здания не будет происходить плавно, добавление сообщений в чат будет задерживаться, а игроки будут жаловаться на «тормоза». После того, как вы избавитесь от проблем с сетью, необходимо продолжить расследование.

FPS сервера

FPS является наиболее очевидным и простым способом проверить производительность сервера. И из-за этого многие владельцы серверов уделяют FPS слишком много внимания. Представители Facepunch много раз заявляли, что значение FPS сервера может быть уменьшено до 30 и игроки не увидят разницы.

При установке чрезмерно высокого FPS повышается нагрузка на ЦП, при этом фактическая производительность не увеличивается. Это важно учитывать, если у вас работает несколько серверов Rust на одной выделенной машине.

Однако нам нужны серверы, на которых FPS никогда не опускается ниже 30 и даже не приближается к этой цифре. Если на вашем сервере FPS падает ниже 30 или отличается нестабильностью, то вам следует внести определённые изменения для повышения производительности.

Значение FPS отображается в нижней правой части окна консоли сервера. В случае, если вас нет непосредственного доступа к консоли, можете ввести команду «fps» в консоли удаленного сервера, и она вернёт нужное вам значение.

Центральный процессор, память, жёсткий диск и использование сети

Независимо от того, работает ваш сервер на Windows или Linux, вы будете использовать стандартные инструменты для мониторинга центрального процессора, памяти, жёсткого диска и использования сети.

Опишем идеальную ситуацию. Вы запускаете один сервер Rust на выделенном компьютере. Используя такие инструменты, как диспетчер задач Windows и монитор ресурсов, вы можете узнать следующее:

  • Использование CPU является низким (никогда не доходит до 100% на любом ядре) и распределяется между несколькими ядрами. Использование CPU на 100 игроков, 170k сущностей, аптайм 12 часов:334fe1dd8c1e4dbe441cbb02d4f02068
  • Использование памяти является таким, как ожидалось. Использование памяти увеличивается со временем, начиная с момента последнего перезапуска сервера Rust и в зависимости от количества сущностей и игроков. Использование памяти на 100 игроков, 170k сущностей, аптайм 12 часов:747af452685cd87513d32ca6f3c24da3

 

  • Использование сети намного ниже максимальной пропускной способности (обычные значения – 250Mbps и выше) и относительно стабильное. Использование сети на 100 подключенных игроков:c3c67592a358

 

  • Использование жесткого диска низкое, а длина очереди не предполагает наличия каких-либо «узких» мест. Также обратите внимание на записывающиеся файлы и на то, что в их число входят файлы Oxide.harddrive

Если после проверки окажется, что параметры производительности вашего сервера не такие, как показано выше – то производительность RustDedicated.exe может находиться под влиянием каких-то факторов.

Имейте в виду, что производительность RustDedicated.exe может быть плохой, даже если использование процессора, памяти, жёсткого диска и сети находится в пределах нормы.

Сбор мусора

По умолчанию уведомления не выводятся на консоль. Вы можете их активировать (global.timewarning 1) на определённые периоды времени, чтобы иметь возможность оценивать производительность. Наиболее важная из получаемой при этом информации: сколько времени занимает сбор мусора.

Если не вдаваться в технические подробности – процесс поиска и освобождения неиспользуемой памяти называется сбором мусора. Сбор мусора имеет решающее значение для контроля за объемом использующейся памяти; за счёт него выделение памяти под новые процессы может продолжаться достаточно долго. Хотя, в конечном счёте, сбор мусора необходим, этот процесс является очень требовательным к ресурсам – если ресурсов не хватает в то время, когда выполняется сбор мусора, сервер начинает тормозить, и игроки сталкиваются с задержками/лагами.

Здесь показано, как сбор мусора длительностью в 1,67 секунды замедляет работу ряда важных серверных функций Rust:

8151c5e21df71d632eb746c085b38802Длительность сбора мусора является хорошим показателем производительности сервера (в частности из-за того, что она связана с количеством сущностей на карте). Если процесс сбора мусора каждый раз занимает более 2 секунд, это становится довольно заметным для игроков. Некоторые грамотные владельцы серверов производят сброс системы (вайп), когда сбор мусора начинает занимать более 2 секунд. Однако это не всегда совпадает с вашим графиком.

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

Как улучшить производительность сервера?

 

Аппаратная часть / операционная система

  • Как упоминалось выше, вам следует позаботиться о том, чтобы на каждый экземпляр RustDedicated.exe приходилось минимум 2 или 3 быстрых выделенных ядра, достаточное количество оперативной памяти и, если это возможно, выделенный SSD.
  • Некоторые владельцы серверов сообщают, что отключение многопоточности улучшает производительность сервера. Однако улучшение получается минимальным.
  • Работая с Windows, всегда следите за тем, чтобы для параметров питания было установлено значение «высокая производительность». Кроме того, проверяйте эти настройки после обновления Windows, так как они могут измениться. Вы не поверите, если узнаете, сколько раз нам сообщали об ужасной производительности, но всё приходило в норму после изменения этих параметров.
  • Если ваш сервер работает на Windows, можете поэкспериментировать с привязкой RustDedicated.exe ко всем ядрам, кроме ядра 0. Смысл в том, что операционная система Windows преференциально использует ядро 0 для решения собственных задач, и, если RustDedicated.exe тоже будет использовать в первую очередь это ядро, получится ненужная нам конкуренция.
  • Можно изменить параметры RustDedicated.exe в диспетчере задач, установив для него приоритет (preference). Некоторые владельцы серверов сообщают об улучшении производительности после выполнения этих действий.  Однако другие владельцы говорят о проблемах, возникающих при установке максимального приоритета.  Проверьте сами, чтобы посмотреть, что будет лучше работать в вашем случае.

Как привязку (/ AFFINITY FE), так и приоритет (/HIGH) можно указать в качестве аргументов команды «start” в файле, использующемся для запуска RustDedicated.exe, вот пример:
@echo off
cls
:start
echo Starting server...
start /WAIT /HIGH /AFFINITY FE RustDedicated.exe -batchmode -nographics -silent-crashes +server.ip xx.xx.xx.xx +rcon.ip xx.xx.xx.xx +server.port 28015 +rcon.port 28016 +rcon.password "password" +rcon.web "1" +server.identity "SERVER"
@echo.
@echo Restarting server...
@echo.
goto start

Сервер Rust

  • Перезапуск сервера может улучшить его производительность. Для сильно модифицированных серверов обычным делом является ежедневный перезапуск (или ещё чаще). Стандартные серверы, как правило, требуют перезагрузки гораздо реже. Перезагрузка сервера может понадобиться в случае, если использование памяти становится недопустимо высоким или если вам нужно избавиться от некоторых недиагностируемых проблем с производительностью. Необходимая частота перезагрузки также изменяется с каждой новой сборкой/обновлением. Так что проявляйте гибкость в подходе.
  • Каждое сохранение сервера влияет на игроков. Подумайте о том, чтобы установить более длительные интервалы между сохранениями (server.saveinterval). Также не помешает объявлять о начале процесса сохранения (через плагин или RustAdmin), чтобы игроки понимали, что происходит.
  • Animal AI также существенно влияет на производительность сервера. Многие владельцы серверов предпочитают отключать Animal AI в часы пик (ai.think 0). Это влияет на геймплей (например, медведи перестают нападать на игроков), но помогает получить дополнительную производительность. В RustAdmin есть возможность запуска заданной команды, когда количество игроков достигает определенного уровня. Протестируйте эту функцию и посмотрите, как будет лучше для вашего сервера.
  • Найдите параметры разрушения, которые подойдут для вашего сервера и помогут вам контролировать рост числа сущностей. Можно изменять параметры разрушения (decay.scale x – управление промежутком времени до начала процесса разрушения и длительностью разрушения после того, как оно началось – decay.scale 2 удваивает скорость разрушения) чтобы сделать его более или менее агрессивным (есть множество плагинов Oxide, которые также помогают регулировать этот процесс). Неиспользуемые разгромленные базы и случайные нагромождения на карте только увеличивают количество сущностей и приводят к тому, что необходимость принудительного сброса системы по соображениям производительности наступает гораздо раньше.
  • Найдите расписание сброса системы, которое поможет вам поддерживать производительность на приемлемом уровне и устроит ваших игроков. Во многом оно будет зависеть от среднего количества игроков на сервере, а также скорости, с которой они строят, и настроек разрушения.
  • Некоторые владельцы серверов экспериментируют с уменьшением частоты процессов сбора мусора. Это делается путём изменения интервала между ними (gc.interval). Смысл в том, что при регулярной перезагрузке сервера ограничивается чрезмерное использование памяти, и игроки не испытывают неудобств из-за задержек, возникающих при сборе мусора.  Установка между процессами сбора мусора более длительного интервала, чем период между перезагрузками сервера (например, «gc.interval 90000″) не избавит вас от этой проблемы, но позволит значительно сократить их частоту.  И это поможет повысить производительность сервера.  Однако неясно, насколько сбор мусора является важным для эффективности выделения памяти – и каким образом его отключение влияет на производительность сервера в целом. Однако первые тесты показали, что установка для сбора мусора более длительного интервала, чем для перезагрузки (по крайней мере, на серверах, которые перезагружаются несколько в день) реально избавляет сервер от «замораживаний».
  • Возможно, вы помните, что раньше в Rust был лимит количества коллайдеров? Он составлял 65 тыс. в Legasy и 260 тыс. в ранних экспериментальных версиях. Обычно при достижении этого лимита все игроки лишались возможности строить, а также многих других вещей. Затем Facepunch представил пакетирование коллайдеров, чтобы обойти эту проблему. Однако в настоящее время при строительстве на больших базах требуется извлечение коллайдеров из пакетов, что приводит к значительной потере производительности.   На тестовом сервере из-за одного игрока, строящего с максимально возможной скоростью на большой базе, FPS может упасть с 256 (установлено в качестве максимального значения) до 80 и даже ниже.  Это происходит постоянно, а на сильно загруженных серверах падение может быть даже серьёзнее – ниже 30 FPS.  Эта проблема особенно характерна для модифицированных серверов, на которых крупные базы являются более распространенными из-за увеличенного количества снаряжения и скорости сбора ресурсов.
  • Вы можете отказаться от пакетирования коллайдеров до тех пор, пока их количество не достигнет ~260 тыс. Чтобы отказаться от пакетирования коллайдеров введите «batching.colliders 0″ в терминале или в конфигурационном файле /cfg/server.cfg. Хотя эту команду можно ввести непосредственно в консоли сервера, без перезагрузки она не вступит в силу. Внимательно следите за количеством коллайдеров (с помощью команды “colliders” в консоли сервера) – необходимо включить пакетирование и перезагрузить систему до того, как число коллайдеров достигнет ~260 тыс. Некоторые серверы устанавливают правила для максимальных размеров базы, что также способствует уменьшению остроты этой проблемы (и в целом помогает контролировать сущности в игровом мире).

 

Oxide

  • У нас нет возможности полностью оценить влияние плагинов на производительность сервера, не существует плагина, который предоставлял бы исчерпывающие данные, и вряд ли он когда-либо появится.
  • Помните, что каждый плагин при работе оказывает влияние на производительность. Но также помните, что влияние большинства плагинов совсем маленькое, если сравнивать с общей активностью сервера. Владельцы модифицированных серверов часто слишком сильно верят в то, что плагины являются виновниками проблем с производительностью – когда причины, скорей всего, более фундаментальные (оборудование или сам движок Rust/Unity). Удаление нескольких плагинов вряд ли поможет добиться заметного улучшения производительности.
  • Некоторые модули/плагины влияют на производительность сильнее, чем другие. Также свою роль играют функции, которые они выполняют. Если плагин каждое мгновение делает кучу дел (OnTick) или постоянно собирает информацию с каждой отдельной сущности, это может вызвать проблемы. Также бывает, что плагин создаёт и использует в своей работе большой файл данных (хранящийся в /oxide/data) – поэтому между сбросами серверов часто рекомендуется выполнять очистку больших файлов данных.
  • RustIO и LustyMap являются примерами расширения и плагина, которые делают большую работу. Поэтому они вполне могут оказывать влияние на производительность сервера. Но большинство владельцев серверов, на которых работают эти приложения, скорей всего, смирятся с влиянием на производительность, поскольку они очень полезны для игроков.
  • Общее время использования для каждого расширения/плагина можно посмотреть с помощью команды «plugins» в консоли сервера. Хотя это вам не пригодится – данный параметр не показывает воздействие на сервер. Это всего лишь время, в течение которого работает плагин. Но если у вас есть плагин, который имеет большое общее время использования, и известно, что он делает много работы, то такой плагин может повлиять на производительность.
  • Используйте плагины, которые позволяют увеличить производительность сервера – например, через повышение эффективности управления ростом сущностей (плагины разрушения) или отключение игроков со слишком высоким пингом.

 

Источник