RE:NODE

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

RAM для сервера FiveM: расчёт по ресурсам

Память сервера FiveM: реальные цифры RAM для freeroam и RP, почему ресурсы важнее слотов, OneSync, текущие скрипты и как всё это измерить.

0 прочтений

Серверу FiveM нужно 2-3 ГБ памяти для freeroam-, дрифт- или гоночного сервера примерно на 32 игрока со скромным списком ресурсов, 4-6 ГБ для RP-сервера на ESX, QBCore или Qbox на 48-64 слота и 8-12 ГБ для большого RP-сервера с сотнями ресурсов и заметно больше чем 64 игроками. Число слотов - самый слабый показатель в этом предложении. Память FXServer следует за ресурсами, которые вы устанавливаете, и состоянием, которое они хранят, поэтому полупустой сервер с двумя сотнями скриптов использует больше, чем полный с сорока, а один плохо написанный скрипт к концу дня может перерасти всё остальное на сервере. Считайте по папке ресурсов, а потом подтверждайте цифрами.

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

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

  • Ядро сервера. Сеть, HTTP-эндпоинт, который раздаёт файлы клиентам, и серверное состояние игры. Само по себе это немного: ванильный сервер с ресурсами по умолчанию в простое занимает несколько сотен мегабайт.
  • Состояние OneSync. С включённым OneSync сервер отслеживает каждую сетевую сущность - игроков, машины, педов, объекты - и их состояние. Больше игроков и больше заспавненных сущностей - больше состояния, а настройки населения определяют, сколько существует фоновых сущностей.
  • Среды выполнения скриптов. Серверные скрипты каждого ресурса работают в среде выполнения: Lua (по умолчанию и самый распространённый вариант с большим отрывом), JavaScript на встроенном Node/V8 или C# на Mono. Каждый ресурс с серверными скриптами на Lua получает собственное Lua-состояние со своей кучей.
  • То, что держат скрипты. Объекты игроков, кэшированные фреймворком, инвентари, данные работ, реестры машин, сообщения в телефоне, данные о жилье и всё, что скрипт загрузил из базы данных и оставил у себя. Именно здесь живёт большая часть памяти RP-сервера.
  • Учёт стриминговых ассетов. Кастомные машины, карты, одежда и интерьеры MLO раздаются клиентам из папки cache сервера. Основной их объём находится на диске и в передаче, но сервер индексирует их при запуске, поэтому очень большие папки stream удлиняют запуск и добавляют немного памяти.

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

RAM по типу сервера#

СерверСлотыRAMvCPUПримечания
Freeroam, дрифт или гонкидо 322-3 GB1-1.5Мало ресурсов, мало постоянного состояния
Лёгкий RP, небольшой список ресурсов32-483-4 GB1.5-2Фреймворк плюс самое необходимое
RP на ESX, QBCore или Qbox48-644-6 GB2Типичный случай
Большой RP, сотни ресурсов64-1288-12 GB2.5-3.5Много скриптов, тяжёлый стриминг
Сервер для разработки или тестов1-52 GB1Те же ресурсы, без игроков

Три вещи двигают сервер вниз по таблице быстрее, чем игроки.

  1. Количество и качество ресурсов. Отобранный список из восьмидесяти хорошо написанных ресурсов на современном фреймворке может потреблять меньше, чем сорок старых, скопированных с форумов. Память на ресурс различается в сотню раз.
  2. Что кэширует фреймворк. Фреймворки держат в памяти данные каждого подключённого игрока, а некоторые ресурсы держат данные каждого когда-либо созданного персонажа, загружая их один раз при запуске. Сервер с десятью тысячами персонажей в базе может платить за всех.
  3. Аптайм. Lua-кучи и кэши растут в течение дня. Сервер, стартовавший с 3 ГБ, через восемь часов может быть на 5 ГБ, и нормальный ли это рост или утечка - тема одного из следующих разделов.

Сами фреймворки сравниваются в статье фреймворки FiveM: ESX, QBCore и Qbox; для расчёта ресурсов они ведут себя похоже, а исход определяют дополнительные ресурсы вокруг них.

Слоты, OneSync и население#

Слоты задаются через sv_maxclients, и всё, что выше 32, требует OneSync. OneSync переносит владение сущностями и их состояние на сервер - именно это делает большие серверы возможными и именно поэтому память сервера следует за числом сущностей.

server.cfg
set onesync onsv_maxclients 64sv_entityLockdown strictensure oxmysqlensure qb-coreensure [qb]ensure [standalone]

Что здесь важно для памяти:

  • Каждая сетевая сущность стоит состояния. Игроки, их машины, фоновый трафик и пешеходы, пропы, заспавненные скриптами, и всё, что создают клиенты. Сервер, где пятьдесят игроков спавнят по машине и бросают её, стоит дороже, чем сервер, где машины хранятся в гаражах.
  • `sv_entityLockdown` определяет, могут ли клиенты сами создавать сетевые сущности. strict полностью запрещает создание на стороне клиента, что закрывает классический способ злоупотребления, когда модифицированный клиент спамит сущностями, пока сервер ими не забьётся. В первую очередь это настройка безопасности, но на загруженном сервере - ещё и памяти. Она может сломать старые скрипты, которые спавнят сущности на стороне клиента, так что протестируйте её.
  • Население. Фоновый трафик и педы - тоже сетевые сущности. Многие RP-серверы снижают плотность населения с помощью ресурса - и ради производительности, и ради геймплея; в результате сервер держит меньше сущностей.

Статья OneSync и слоты игроков глубже разбирает сторону сущностей, а разбор server.cfg описывает каждую строку вокруг этих настроек.

Текущие скрипты: обычный виновник#

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

Классическое исправление - один обработчик:

lua
local playerCache = {}AddEventHandler('playerDropped', function()    playerCache[source] = nilend)

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

Чтобы найти растущий ресурс, измеряйте Lua-кучу каждого ресурса изнутри. Подойдёт небольшой отладочный ресурс или временная строка в подозрительном скрипте:

lua
CreateThread(function()    while true do        Wait(60000)        local mb = collectgarbage('count') / 1024        print(('[%s] Lua heap: %.1f MB'):format(GetCurrentResourceName(), mb))    endend)

collectgarbage('count') возвращает текущую Lua-кучу этого ресурса в килобайтах. Оставьте это работать на несколько часов обычной игры. Ресурс, цифра которого то растёт, то падает, здоров; ресурс, цифра которого только растёт, течёт. После проверки уберите отладочную строку.

Измеряйте, прежде чем покупать#

Четыре инструмента в том порядке, в каком их стоит применять.

  1. График памяти за целый день. Сервер FiveM после запуска растёт по мере входа игроков и заполнения кэшей, а затем выходит на плато. Линия, которая продолжает расти до следующего перезапуска, - утечка. Линия, которая выходит на плато у самого лимита, - сервер, который действительно мал.
  2. `resmon` на клиенте. Нажмите F8 и выполните resmon 1. Он показывает процессорное время и память каждого ресурса на этом клиенте. Серверную стоимость он не показывает, но ресурсы, тяжёлые на клиенте, обычно тяжелы и на сервере, а раздутость на стороне клиента - половина того, что ощущают игроки.
  3. Серверный профилировщик. profiler record 500 в консоли сервера записывает 500 кадров, затем profiler view открывает результат. Это инструмент для CPU, а не для памяти, но ресурс, доминирующий в профиле, часто тот же, что доминирует в памяти. Как его читать, разобрано в статье производительность сервера FiveM и resmon.
  4. Lua-куча каждого ресурса - с помощью фрагмента выше, для подозреваемых, которых выявили первые три шага.

Чего вы не получите, если сервер внутри контейнера упрётся в лимит памяти, так это полезной ошибки. Процесс останавливается, и лог обрывается. На RE:NODE сервер, достигший лимита памяти, останавливается и чисто перезапускается, а не уходит в swap, - поэтому проблема с памятью проявляется как необъяснимые перезапуски, часто примерно в одно и то же время суток.

Перезапуски и почему RP-серверы ставят их по расписанию#

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

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

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

Серверы для разработки и две копии#

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

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

Полезный подход:

  1. Считайте dev-сервер по базовому уровню, а не по пику. Запустите список ресурсов живого сервера без игроков и запишите память после того, как стартовали все ресурсы. Dev-серверу нужно столько плюс запас, обычно на тариф ниже живого сервера.
  2. Сначала тестируйте новые ресурсы там, с работающим фрагментом для Lua-кучи. Скрипт с утечкой проявит себя за день тестов, а не за вечер, когда игроков выкидывает с сервера.
  3. Держите базу данных отдельно. Направьте dev-сервер на собственную базу данных и никогда - на живую. Тестовый скрипт, стирающий таблицу, должен стирать тестовую таблицу.
  4. Используйте тот же серверный артефакт. Память и поведение меняются между сборками FXServer, поэтому тест на другой сборке доказывает меньше, чем кажется.

На RE:NODE у каждого сервера свои лимиты, своя панель и свои backup, поэтому dev-сервер - это просто второй, меньший тариф. Субпользователи позволяют разработчикам заходить в консоль и файлы dev-сервера без доступа к живому.

База данных и диск#

RP-фреймворки опираются на базу данных для персонажей, инвентарей, машин и недвижимости. База данных - отдельный процесс со своими потребностями в памяти, и считается ли она в лимит игрового сервера, зависит от того, где она работает. Небольшой базе RP-сервера комфортно в нескольких сотнях мегабайт; большая, с таблицами логов, которые никто не чистит, растёт без предела. Строка подключения, медленные запросы и таблицы, которые стоит чистить, описаны в статье база данных FiveM и oxmysql.

На диске живут стриминговые ассеты. У сервера с сотней кастомных машин, десятком интерьеров MLO и паком одежды папка ресурсов может занимать 10-20 ГБ, плюс папка cache, которую FXServer из неё строит. Оставьте место для обеих и для нескольких серверных артефактов, хранимых для отката. Лимиты стриминга и то, почему слишком большие ассеты вредят клиентам сильнее, чем серверам, описаны в статье MLO-карты и стриминговые ассеты.

CPU: вторая половина вопроса#

Игроки редко первым делом ощущают именно память. FXServer выполняет скрипты в одном главном потоке, поэтому ресурс, делающий дорогую работу каждый кадр, задерживает всё остальное, и это проявляется как рассинхрон и откаты при памяти далеко от лимита. Консоль сервера выводит предупреждение о hitch, когда серверный кадр длится слишком долго, - это первое, что стоит искать, когда игроки жалуются. Одно быстрое ядро для главного потока плюс второе для сети и раздачи ассетов - реалистичный минимум для RP. Общий метод, позволяющий отличить одно от другого, описан в статье CPU или RAM: что тормозит ваш сервер.

Тарифы FiveM на RE:NODE - от 2 ГБ до 12 ГБ, от $9 в месяц, с двумя выделенными портами и доступным txAdmin. Ключ Cfx.re вводится на вкладке Setup, потому что он выдаётся на ваш аккаунт, а переход на тариф выше поднимает лимиты на уже существующем сервере.

FAQ#

Хватит ли RP-серверу FiveM 4 ГБ?

Небольшому RP-серверу с фреймворком и отобранным списком ресурсов обычно хватит - примерно до 48 игроков. Серверу на 64 слота с типичной для сообществ папкой ресурсов комфортнее с 6 ГБ. Прежде чем решать, посмотрите на график памяти за целый день; важна цифра в конце дня.

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

Отчасти - каждый игрок добавляет состояние сущностей, сетевые буферы и данные фреймворка. Но доминируют ресурсы. Удвоение игроков при том же списке ресурсов увеличивает память умеренно; удвоение списка ресурсов может прямо удвоить её.

Почему память сервера FiveM всё время растёт?

Обычно это ресурс, который кэширует данные по каждому игроку и никогда их не очищает или со временем загружает из базы всё больше и больше. Измерьте Lua-кучу каждого подозреваемого через collectgarbage('count') или перезапускайте ресурсы по одному и смотрите, после какого перезапуска освобождается больше всего памяти.

Расходуют ли кастомные машины и MLO оперативную память сервера?

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

Как часто нужно перезапускать сервер FiveM?

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


Комментарии

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

0/2000