Серверу 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 по типу сервера#
| Сервер | Слоты | RAM | vCPU | Примечания |
|---|---|---|---|---|
| Freeroam, дрифт или гонки | до 32 | 2-3 GB | 1-1.5 | Мало ресурсов, мало постоянного состояния |
| Лёгкий RP, небольшой список ресурсов | 32-48 | 3-4 GB | 1.5-2 | Фреймворк плюс самое необходимое |
| RP на ESX, QBCore или Qbox | 48-64 | 4-6 GB | 2 | Типичный случай |
| Большой RP, сотни ресурсов | 64-128 | 8-12 GB | 2.5-3.5 | Много скриптов, тяжёлый стриминг |
| Сервер для разработки или тестов | 1-5 | 2 GB | 1 | Те же ресурсы, без игроков |
Три вещи двигают сервер вниз по таблице быстрее, чем игроки.
- Количество и качество ресурсов. Отобранный список из восьмидесяти хорошо написанных ресурсов на современном фреймворке может потреблять меньше, чем сорок старых, скопированных с форумов. Память на ресурс различается в сотню раз.
- Что кэширует фреймворк. Фреймворки держат в памяти данные каждого подключённого игрока, а некоторые ресурсы держат данные каждого когда-либо созданного персонажа, загружая их один раз при запуске. Сервер с десятью тысячами персонажей в базе может платить за всех.
- Аптайм. Lua-кучи и кэши растут в течение дня. Сервер, стартовавший с 3 ГБ, через восемь часов может быть на 5 ГБ, и нормальный ли это рост или утечка - тема одного из следующих разделов.
Сами фреймворки сравниваются в статье фреймворки FiveM: ESX, QBCore и Qbox; для расчёта ресурсов они ведут себя похоже, а исход определяют дополнительные ресурсы вокруг них.
Слоты, OneSync и население#
Слоты задаются через sv_maxclients, и всё, что выше 32, требует OneSync. OneSync переносит владение сущностями и их состояние на сервер - именно это делает большие серверы возможными и именно поэтому память сервера следует за числом сущностей.
set onesync onsv_maxclients 64sv_entityLockdown strictensure oxmysqlensure qb-coreensure [qb]ensure [standalone]Что здесь важно для памяти:
- Каждая сетевая сущность стоит состояния. Игроки, их машины, фоновый трафик и пешеходы, пропы, заспавненные скриптами, и всё, что создают клиенты. Сервер, где пятьдесят игроков спавнят по машине и бросают её, стоит дороже, чем сервер, где машины хранятся в гаражах.
- `sv_entityLockdown` определяет, могут ли клиенты сами создавать сетевые сущности.
strictполностью запрещает создание на стороне клиента, что закрывает классический способ злоупотребления, когда модифицированный клиент спамит сущностями, пока сервер ими не забьётся. В первую очередь это настройка безопасности, но на загруженном сервере - ещё и памяти. Она может сломать старые скрипты, которые спавнят сущности на стороне клиента, так что протестируйте её. - Население. Фоновый трафик и педы - тоже сетевые сущности. Многие RP-серверы снижают плотность населения с помощью ресурса - и ради производительности, и ради геймплея; в результате сервер держит меньше сущностей.
Статья OneSync и слоты игроков глубже разбирает сторону сущностей, а разбор server.cfg описывает каждую строку вокруг этих настроек.
Текущие скрипты: обычный виновник#
Большинство серверов FiveM, которым не хватает памяти, не слишком малы. У них есть ресурс, память которого только растёт. Схема почти всегда одна: таблица с ключом по игроку, которая заполняется при входе и никогда не очищается при выходе, кэш, загружающий каждую строку, которую когда-либо видел, или цикл, создающий замыкания или таймеры быстрее, чем они завершаются.
Классическое исправление - один обработчик:
local playerCache = {}AddEventHandler('playerDropped', function() playerCache[source] = nilend)Без него каждый вход за всю жизнь сервера добавляет запись, которая никогда не освобождается. На сервере с частыми переподключениями это тысячи записей в день, и каждая держит то, что сохранил скрипт.
Чтобы найти растущий ресурс, измеряйте 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-кучу этого ресурса в килобайтах. Оставьте это работать на несколько часов обычной игры. Ресурс, цифра которого то растёт, то падает, здоров; ресурс, цифра которого только растёт, течёт. После проверки уберите отладочную строку.
Измеряйте, прежде чем покупать#
Четыре инструмента в том порядке, в каком их стоит применять.
- График памяти за целый день. Сервер FiveM после запуска растёт по мере входа игроков и заполнения кэшей, а затем выходит на плато. Линия, которая продолжает расти до следующего перезапуска, - утечка. Линия, которая выходит на плато у самого лимита, - сервер, который действительно мал.
- `resmon` на клиенте. Нажмите F8 и выполните
resmon 1. Он показывает процессорное время и память каждого ресурса на этом клиенте. Серверную стоимость он не показывает, но ресурсы, тяжёлые на клиенте, обычно тяжелы и на сервере, а раздутость на стороне клиента - половина того, что ощущают игроки. - Серверный профилировщик.
profiler record 500в консоли сервера записывает 500 кадров, затемprofiler viewоткрывает результат. Это инструмент для CPU, а не для памяти, но ресурс, доминирующий в профиле, часто тот же, что доминирует в памяти. Как его читать, разобрано в статье производительность сервера FiveM и resmon. - Lua-куча каждого ресурса - с помощью фрагмента выше, для подозреваемых, которых выявили первые три шага.
Чего вы не получите, если сервер внутри контейнера упрётся в лимит памяти, так это полезной ошибки. Процесс останавливается, и лог обрывается. На RE:NODE сервер, достигший лимита памяти, останавливается и чисто перезапускается, а не уходит в swap, - поэтому проблема с памятью проявляется как необъяснимые перезапуски, часто примерно в одно и то же время суток.
Перезапуски и почему RP-серверы ставят их по расписанию#
Большинство RP-серверов перезапускается каждые шесть-двенадцать часов, обычно в фиксированное время, объявленное в игре. Это началось как обходной путь именно для описанного выше роста памяти и прижилось, потому что заодно очищает фоновые сущности, сбрасывает скрипты, сползшие в плохое состояние, и даёт предсказуемый момент для обновлений.
В txAdmin есть встроенный планировщик перезапусков: задайте время в его настройках, и он будет с интервалами предупреждать игроков перед каждым перезапуском. Это лучше слепого перезапуска процесса, потому что даёт скриптам шанс сохраниться, а фреймворки сохраняют данные игрока при его выходе.
Перезапуск по расписанию - разумный костыль, а не лекарство. Если серверу нужен перезапуск каждые четыре часа, чтобы оставаться в пределах памяти, что-то течёт, и описанные выше шаги профилирования найдут это быстрее, чем апгрейд это спрячет.
Серверы для разработки и две копии#
Большинство RP-сообществ в итоге держат два сервера: живой и копию для разработки, где новые скрипты тестируются, прежде чем дойти до игроков. Размер второго легко ошибочно выбрать в обе стороны.
На сервере для разработки мало игроков, часто только разработчики, поэтому ему не нужен запас живого сервера на полный вечер. Но он должен загружать тот же список ресурсов, а поскольку память FiveM определяют ресурсы, а не игроки, dev-сервер с полным списком в простое потребляет ненамного меньше живого. Тариф на 2 ГБ, который не может даже запустить папку ресурсов живого сервера, бесполезен для её тестирования.
Полезный подход:
- Считайте dev-сервер по базовому уровню, а не по пику. Запустите список ресурсов живого сервера без игроков и запишите память после того, как стартовали все ресурсы. Dev-серверу нужно столько плюс запас, обычно на тариф ниже живого сервера.
- Сначала тестируйте новые ресурсы там, с работающим фрагментом для Lua-кучи. Скрипт с утечкой проявит себя за день тестов, а не за вечер, когда игроков выкидывает с сервера.
- Держите базу данных отдельно. Направьте dev-сервер на собственную базу данных и никогда - на живую. Тестовый скрипт, стирающий таблицу, должен стирать тестовую таблицу.
- Используйте тот же серверный артефакт. Память и поведение меняются между сборками 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.