RE:NODE

Ресурсы11 мин чтения

RAM для сервера Rust: по карте и вайпу

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

0 прочтений

Серверу Rust нужно около 8-10 ГБ памяти для карты размером 3000 и до пятидесяти игроков, 12-16 ГБ для распространённых карт 3500-4000 на 75-125 игроков и 16-24 ГБ для карты от 4500 с онлайном, способным её заполнить. Маленький приватный сервер для компании друзей на карте 2000-2500 укладывается в 6-8 ГБ. Это цифры для конца вайпа, а не для начала: потребление памяти в Rust минимально в первый час после вайпа и максимально в день перед следующим, потому что каждая стена, ящик и печь, которые ставят игроки, остаются в памяти до вайпа карты. Рассчитывайте на самый загруженный день цикла, оставляйте запас под сохранение и помните, что самый первый запуск свежей карты - самый тяжёлый момент из всех.

Что сервер Rust держит в памяти#

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

Основные потребители:

  • Сама карта. Карта высот рельефа, слои splat и топологии, данные биомов, сплайны дорог и рек, все монументы и префабы. Память под карту растёт быстрее, чем линейно, вместе с server.worldsize, потому что растут оба измерения, а на больших картах больше монументов.
  • Сущности. Каждый строительный блок, дверь, ящик, печь, турель, спальник, выброшенный предмет, труп, бочка, рудная жила, животное и NPC - это сетевая сущность. Зрелый вайп на загруженном сервере держит их сотни тысяч, и именно эта строка растёт в течение цикла.
  • Контейнеры предметов. Каждый ящик хранит свои предметы как объекты. Увеличенный размер стаков на модифицированном сервере означает меньше предметов, но с большими количествами, а повышенные рейты добычи - больше вещей в мире в целом.
  • Плагины. Oxide или Carbon загружают каждый плагин в тот же процесс вместе с его файлами данных, кэшами и таймерами. Большинство стоит немного; некоторые держат в памяти крупные структуры.
  • Запас для сборщика мусора. Управляемой куче нужно свободное место для работы. Если держать её вплотную к лимиту, сборки мусора становятся чаще и медленнее.

Последний пункт обычно упускают. Сервер Rust, который действительно держит 9 ГБ живых данных, не будет нормально работать в контейнере на 10 ГБ, потому что сборщику нужно место, а процесс сохранения выделяет память во время записи.

RAM по размеру мира и онлайну#

Это рабочие цифры для ванильного или слегка модифицированного сервера, замеренные в конце недельного цикла вайпа, а не в день вайпа.

Размер мираИгроков онлайнRAMПримечания
1500-25002-10 друзей6-8 GBПриватные серверы, короткие вайпы
3000до 508-10 GBМаленький и плотный
3500-400075-12512-16 GBТипичный диапазон для сообществ
4500-5000150+16-24 GBТолько если есть онлайн, чтобы её заполнить
Любой размер, тяжёлые плагины-плюс 2-4 GBЗависит от того, что хранят плагины
Кастомная карта с множеством префабов-плюс 2-4 GBЗависит от автора карты

Два предупреждения о таблице.

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

Размер мира - это ваш выбор, и это самый дешёвый рычаг из всех. Карта 4500 с тридцатью игроками - это в основном пустая земля, за хранение которой в памяти вы платите, и играется она хуже: люди разбредаются, рейдов меньше, и сервер кажется мёртвым. Выбирайте размер карты под онлайн, который у вас реально есть. В статье вайпы Rust без потери игроков разобрано, как связаны размер карты, частота вайпов и онлайн.

Почему пик памяти - в день перед вайпом#

Постройте график памяти сервера Rust за цикл вайпа, и получится наклонная линия, а не ровная. День вайпа начинается с базового уровня карты. Каждый вечер добавляет базы, постройки и лут. Содержание и гниение убирают часть этого, но на активном сервере они убирают меньше, чем добавляют игроки. К последнему дню цикла сервер может держать на несколько гигабайт больше, чем в первый.

пишет файл .mapГенерация картысамый тяжёлый моментДень вайпатолько база картыСередина вайпакопятся базы и лутДень перед вайпомпик, под него и братьКаждое сохранениекраткий всплеск памяти
Куда уходит память Rust за цикл вайпа

Отсюда два практических следствия.

  1. Никогда не рассчитывайте ресурсы по дню вайпа. Сервер, который в четверг днём после четвергового вайпа держится на 55%, в следующую среду может быть на 95%. Прежде чем решать, что тариф подходит, посмотрите график за весь цикл.
  2. Перезапускайте, но не ждите, что перезапуск всё сбросит. Перезапуск устраняет фрагментацию и всё, что утекало у плагинов, и часто возвращает гигабайт или больше. Сущности он не убирает, потому что они загружаются обратно из сохранения. Это делают только гниение, очистка и сам вайп.

Всплеск при генерации карты#

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

После генерации карта кэшируется в папке identity сервера:

code
server/my_server_identity/  proceduralmap.4000.12345.<protocol>.map  proceduralmap.4000.12345.<protocol>.sav  player.blueprints.<n>.db

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

Если первый запуск после вайпа падает, а второй проходит, или всё работает только после уменьшения карты, вы столкнулись именно с этим. Решения по порядку:

  1. Убедитесь, что во время генерации память больше ничем не занята: никаких плагинов с тяжёлой работой при загрузке, никакого второго процесса.
  2. Сгенерируйте карту один раз, пока подключиться могут немногие, и пускайте людей после того, как файл .map появится.
  3. Уменьшите server.worldsize на 500. Экономия памяти реальная, а игроки мало что заметят.
  4. Сгенерируйте карту там, где больше памяти, и загрузите файл .map с тем же размером, сидом и протоколом в имени.

Всё это задаёт обычная строка запуска:

bash
$ ./RustDedicated -batchmode -nographics \    +server.identity "my_server_identity" \    +server.worldsize 4000 +server.seed 12345 \    +server.maxplayers 100 +server.saveinterval 600 \    +rcon.web 1 +rcon.port 28016 +rcon.password "change-me"

server.worldsize принимает значения от 1000 до 6000. Сид - любое целое число. Кастомные карты вместо размера и сида используют server.levelurl, указывающий на размещённый где-то файл .map, и их потребление памяти целиком зависит от того, сколько префабов расставил автор.

Настройки, которые определяют, сколько будет построено#

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

ConvarПо умолчаниюВлияние на память
server.worldsizeзадаётся при запускеБазовый уровень карты и то, насколько разбредутся игроки
decay.scale10 отключает гниение; заброшенные базы никогда не исчезают
decay.upkeeptrueИз-за содержания большие базы требуют ресурсов на поддержание
server.maxplayersзадаётся при запускеКосвенно: больше строителей - больше сущностей
server.saveinterval600 в последних сборкахКак часто сохранение выделяет память и пишет на диск

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

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

Плагины: Oxide, Carbon и их цена#

И Oxide (uMod), и Carbon загружают плагины в процесс сервера как скомпилированный C#. Сам фреймворк добавляет несколько сотен мегабайт. Отдельные плагины сильно различаются:

  • Дешёвые: форматирование чата, киты, команды телепорта, простые инструменты администратора. От килобайт до нескольких мегабайт каждый.
  • Умеренные: плагины экономики и магазинов, конфигурации с обилием прав и тысячами игроков в файлах данных, мосты в Discord.
  • Дорогие: всё, что отслеживает данные по каждой сущности на всей карте, плагины кастомных NPC и событий, которые спавнят собственные сущности, плагины статистики и логирования по всей карте, держащие историю в памяти, и плагины лута, заполняющие дополнительные контейнеры.

Файлы данных плагинов лежат в oxide/data (или в carbon/data у Carbon) и загружаются в память при запуске плагина. Файл данных, разросшийся за месяцы истории игроков до сотен мегабайт, - это затраты памяти при каждом запуске. Время от времени проверяйте их размер; фреймворкам посвящены статьи плагины Rust Oxide и uMod и Carbon или Oxide.

Самая быстрая проверка подозрительного плагина - скучная: выгрузите его командой oxide.unload PluginName (или c.unload на Carbon), дождитесь сборки мусора и посмотрите, упадёт ли память. Затем загрузите его снова и посмотрите, поднимется ли она обратно.

Как доказать, что проблема в памяти#

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

  1. Следите за памятью на протяжении всего цикла вайпа. Если в последний день пик находится в пределах 10% от лимита, вам нужно либо больше памяти, либо меньше сущностей.
  2. Проверьте `server.fps` в самый загруженный час. Низкий FPS сервера при памяти заметно ниже лимита - это проблема CPU: число сущностей, плагины или AI. Больше памяти тут не поможет. Что делать вместо этого, описано в статье требования игрового сервера к CPU.
  3. Посмотрите, как сервер останавливается. Сервер Rust, которому не хватило памяти внутри контейнера, не выводит понятной ошибки. Лог просто обрывается, часто посреди сохранения, и следующий запуск загружает то, что последним было успешно записано. Если лог закончился без исключения, посмотрите на график памяти за минуты до этого.
  4. Проверьте время сохранения. По мере роста мира сохранение длится дольше и выделяет больше памяти. Сохранение, которое в последний день вайпа замораживает сервер на несколько секунд, - признак того, что мир велик для тарифа, а сохранение, прерванное лимитом памяти, может оставить повреждённый .sav.

Статья производительность сервера Rust и сущности подробнее разбирает число сущностей и FPS сервера.

Rust на арендованном железе#

Rust нет в каталоге игр RE:NODE, поэтому указать на тариф для Rust нельзя. Для сервера сообщества честный ответ - машина, где весь выделенный объём принадлежит вам: VDS или выделенный сервер. С учётом операционной системы, процесса backup и запаса под сохранение 16 ГБ - реалистичный минимум для сервера сообщества на карте 3500-4000; 24 ГБ дают карте 4500 свободно дышать. Маленькому серверу для друзей на карте 2000 вполне хватает 8 ГБ.

На чём бы вы его ни запускали, три привычки делают историю с памятью скучной:

  • Ежедневный перезапуск по расписанию в спокойный час с предупреждением в игре заранее. Он устраняет фрагментацию и утечки плагинов, и именно тогда чисто проходят обновления и перезагрузка плагинов. О выборе времени - в статье расписания перезапусков, которые помогают.
  • Backup перед каждым вайпом и каждым обновлением. Папка identity - это и есть сервер. Делайте backup server/<identity> и папок данных и конфигов плагинов.
  • Проверка памяти в день перед каждым вайпом. Именно эта цифра скажет, нужна ли в следующем цикле карта поменьше или тариф побольше.

На VDS вы также выбираете, что происходит при достижении лимита. OOM killer в Linux выберет самый большой процесс, то есть RustDedicated, и просто убьёт его. Небольшой файл подкачки даёт время на предупреждение, а не дополнительный объём - в статье swap в Linux и OOM killer объясняется, почему немного полезно, а много только вредит.

FAQ#

Хватит ли серверу Rust 8 ГБ?

Для карты 3000 примерно на пятьдесят игроков или для карты поменьше для компании друзей - да. Типичная для сообществ карта 3500-4000 в день вайпа работать будет, но к концу недели начнёт задыхаться. Если у вас 8 ГБ, подбирайте размер карты под них, а не наоборот.

Растёт ли потребление RAM в Rust с числом игроков?

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

Почему сервер Rust упал при первом запуске после вайпа?

Почти наверняка из-за генерации карты. Построение процедурной карты требует больше памяти, чем её работа, а первый запуск с новым размером или сидом должен её сгенерировать. Уменьшите мир на 500 или сгенерируйте его один раз там, где больше памяти, и сохраните файл .map.

Много ли RAM потребляют плагины Oxide?

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

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

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


Комментарии

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

0/2000