Серверу 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-2500 | 2-10 друзей | 6-8 GB | Приватные серверы, короткие вайпы |
| 3000 | до 50 | 8-10 GB | Маленький и плотный |
| 3500-4000 | 75-125 | 12-16 GB | Типичный диапазон для сообществ |
| 4500-5000 | 150+ | 16-24 GB | Только если есть онлайн, чтобы её заполнить |
| Любой размер, тяжёлые плагины | - | плюс 2-4 GB | Зависит от того, что хранят плагины |
| Кастомная карта с множеством префабов | - | плюс 2-4 GB | Зависит от автора карты |
Два предупреждения о таблице.
Столбец с игроками показывает, сколько будет построено, а не прямую стоимость. Каждый подключённый игрок добавляет сетевые буферы и немного состояния, может быть десятки мегабайт. Гигабайты стоит то, что игроки строят. Клановый сервер на двадцать человек, где каждая группа строит комплекс со стенами, турелями и двадцатью большими ящиками, может требовать больше памяти, чем сервер на пятьдесят соло-игроков, живущих в домиках два на два.
Размер мира - это ваш выбор, и это самый дешёвый рычаг из всех. Карта 4500 с тридцатью игроками - это в основном пустая земля, за хранение которой в памяти вы платите, и играется она хуже: люди разбредаются, рейдов меньше, и сервер кажется мёртвым. Выбирайте размер карты под онлайн, который у вас реально есть. В статье вайпы Rust без потери игроков разобрано, как связаны размер карты, частота вайпов и онлайн.
Почему пик памяти - в день перед вайпом#
Постройте график памяти сервера Rust за цикл вайпа, и получится наклонная линия, а не ровная. День вайпа начинается с базового уровня карты. Каждый вечер добавляет базы, постройки и лут. Содержание и гниение убирают часть этого, но на активном сервере они убирают меньше, чем добавляют игроки. К последнему дню цикла сервер может держать на несколько гигабайт больше, чем в первый.
Отсюда два практических следствия.
- Никогда не рассчитывайте ресурсы по дню вайпа. Сервер, который в четверг днём после четвергового вайпа держится на 55%, в следующую среду может быть на 95%. Прежде чем решать, что тариф подходит, посмотрите график за весь цикл.
- Перезапускайте, но не ждите, что перезапуск всё сбросит. Перезапуск устраняет фрагментацию и всё, что утекало у плагинов, и часто возвращает гигабайт или больше. Сущности он не убирает, потому что они загружаются обратно из сохранения. Это делают только гниение, очистка и сам вайп.
Всплеск при генерации карты#
Первый запуск после вайпа карты строит весь процедурный мир в памяти, прежде чем записать его на диск, и это самое высокое потребление памяти, которого сервер когда-либо достигнет. Сервер, который прекрасно держал бы готовую карту 4000, может упасть из-за нехватки памяти во время её генерации.
После генерации карта кэшируется в папке identity сервера:
server/my_server_identity/ proceduralmap.4000.12345.<protocol>.map proceduralmap.4000.12345.<protocol>.sav player.blueprints.<n>.dbВ имени файла записаны размер мира, сид и номер протокола игры. При каждом следующем запуске сервер загружает кэшированный .map вместо генерации, что и быстрее, и легче. Если меняется протокол (обновление с принудительным вайпом) или вы меняете размер или сид, генерация происходит заново.
Если первый запуск после вайпа падает, а второй проходит, или всё работает только после уменьшения карты, вы столкнулись именно с этим. Решения по порядку:
- Убедитесь, что во время генерации память больше ничем не занята: никаких плагинов с тяжёлой работой при загрузке, никакого второго процесса.
- Сгенерируйте карту один раз, пока подключиться могут немногие, и пускайте людей после того, как файл
.mapпоявится. - Уменьшите
server.worldsizeна 500. Экономия памяти реальная, а игроки мало что заметят. - Сгенерируйте карту там, где больше памяти, и загрузите файл
.mapс тем же размером, сидом и протоколом в имени.
Всё это задаёт обычная строка запуска:
$ ./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.scale | 1 | 0 отключает гниение; заброшенные базы никогда не исчезают |
decay.upkeep | true | Из-за содержания большие базы требуют ресурсов на поддержание |
server.maxplayers | задаётся при запуске | Косвенно: больше строителей - больше сущностей |
server.saveinterval | 600 в последних сборках | Как часто сохранение выделяет память и пишет на диск |
Введите в консоли одно лишь имя 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 примерно поровну делятся между памятью и главным потоком, и решения у них не пересекаются. Выясните, какая из них у вас.
- Следите за памятью на протяжении всего цикла вайпа. Если в последний день пик находится в пределах 10% от лимита, вам нужно либо больше памяти, либо меньше сущностей.
- Проверьте `server.fps` в самый загруженный час. Низкий FPS сервера при памяти заметно ниже лимита - это проблема CPU: число сущностей, плагины или AI. Больше памяти тут не поможет. Что делать вместо этого, описано в статье требования игрового сервера к CPU.
- Посмотрите, как сервер останавливается. Сервер Rust, которому не хватило памяти внутри контейнера, не выводит понятной ошибки. Лог просто обрывается, часто посреди сохранения, и следующий запуск загружает то, что последним было успешно записано. Если лог закончился без исключения, посмотрите на график памяти за минуты до этого.
- Проверьте время сохранения. По мере роста мира сохранение длится дольше и выделяет больше памяти. Сохранение, которое в последний день вайпа замораживает сервер на несколько секунд, - признак того, что мир велик для тарифа, а сохранение, прерванное лимитом памяти, может оставить повреждённый
.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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.