RE:NODE

Руководства12 мин чтения

Настройка сервера Garry's Mod: аддоны, Workshop и производительность

Установка srcds, server.cfg и лимиты песочницы, коллекции Workshop и FastDL, режимы игры, админ-моды и почему полный сервер Garry's Mod тормозит.

Обновлено

0 прочтений

Garry's Mod - песочница в самом прямом смысле: сервер выполняет тот Lua, который есть в ваших аддонах, и производительность определяется этим кодом, а не самой игрой. Два сервера на одном тарифе могут вести себя совершенно по-разному, и разница - в списке аддонов. Сама установка - одна команда SteamCMD и стартовая строка; всё остальное - доставка контента, дисциплина в Lua и несколько консольных переменных. Песочница на дюжину друзей помещается в 1-2 GB. Сервер DarkRP на сорок слотов с большой коллекцией Workshop хочет 4-6 GB и всё равно упрётся в одно ядро процессора.

Что вы на самом деле запускаете#

Сервер Garry's Mod - это выделенный сервер Source, srcds, работающий с игровым каталогом garrysmod, с идентификатором приложения 4020 в Steam. Он ставится анонимно, лицензия на игру не нужна, и по сравнению с большинством современных игр он невелик. Поверх него работает песочница на Lua: режим игры, любое число аддонов и механизм Workshop, который доставляет их на машины игроков.

Три факта определяют всё остальное:

  • Сервер по умолчанию 32-разрядный. Стандартная ветка запускает 32-разрядный бинарник, который может адресовать примерно 3-4 GB независимо от того, что написано в вашем тарифе. Сервер, который умирает с ошибкой выделения памяти, пока панель показывает свободную память, не ограничен - он упёрся в потолок 32 бит. Есть бета-ветка x86-64, которая ставит 64-разрядные бинарники рядом с 32-разрядными, и для больших коллекций её стоит использовать, но каждый скомпилированный бинарный модуль, которым вы пользуетесь, должен существовать и в 64-разрядной сборке.
  • Lua работает в одном потоке. Всё, что делают режим игры и каждый аддон, происходит последовательно, внутри тика. Никакое число дополнительных ядер не сделает дешевле плохо написанный хук Think.
  • Клиентам нужен тот же контент, что и вам. Тот факт, что аддон есть на сервере, сам по себе ничего не значит. Доставка его игроку - отдельная задача, и именно из неё вырастает большинство жалоб «мой сервер сломан».

Требования и потребление ресурсов#

СерверRAMCPUПримечания
Песочница, 8-16 игроков, небольшая коллекция1-2 GB1 ядроОбычный сервер только для друзей
TTT / murder / prop hunt, 16-242-3 GB1-1,5 ядраРежимы с раундами ведут себя предсказуемо
DarkRP, 32-40 игроков4-6 GB2-2,5 ядраСущности, профессии и принтеры, всё на Lua
Всё, где коллекция из 200 предметов4-6 GB2+ ядраПамять определяет коллекция, а не игроки

Память в Garry's Mod следует за размером коллекции Workshop гораздо точнее, чем за числом игроков. Lua, модели и материалы каждого аддона хранятся на сервере, и сотня наборов пропов стоит одинаково, подключён один человек или сорок. Диска нужно немного: базовая установка занимает пару гигабайт, а большая коллекция добавляет ещё несколько.

Потолок, в который на самом деле упираются все, - это CPU. Смотреть надо на время кадра сервера: если сервер не успевает завершить тик в отведённый бюджет, движение дёргается сразу у всех. Выполните stats в консоли и прочитайте столбцы fps и cpu; на здоровом сервере fps держится на уровне tick rate или чуть выше. Тарифы Garry's Mod у нас начинаются с 1 GB и доходят до 6 GB, чего хватает от сервера-песочницы до загруженного ролевого сервера.

Установка сервера и стартовая строка#

bash
$ steamcmd +force_install_dir /home/gmod/server +login anonymous \    +app_update 4020 validate +quit$ cd /home/gmod/server$ ./srcds_run -game garrysmod -console -usercon -port 27015 \    +maxplayers 24 +gamemode sandbox +map gm_construct \    +host_workshop_collection 123456789 -authkey <steam_web_api_key>

На панели вы этого не набираете: те же значения находятся в полях на вкладке Startup. В любом случае важны вот эти параметры:

ПараметрЧто делает
-game garrysmodКакой игровой каталог загружает srcds
-consoleРаботать в консоли, а не открывать окно
-userconВключает RCON. Без него rcon_password ничего не делает
-port 27015Игровой порт
+maxplayers 24Число слотов. Нельзя изменить без перезапуска
+gamemode sandboxИмя папки режима игры в garrysmod/gamemodes
+map gm_constructПервая загружаемая карта
+host_workshop_collectionИдентификатор коллекции Workshop, которую сервер скачивает при запуске
-authkeyКлюч Steam Web API, необходимый, чтобы работала строка выше
-tickrate 33Тиков в секунду, задаётся явно
+sv_setsteamaccountGame Server Login Token

Два из них заслуживают большего, чем строка таблицы. -authkey - это ключ Steam Web API со страницы разработчика Steam, и без него host_workshop_collection молча ничего не скачивает: сервер запускается, коллекция игнорируется, а игроки приходят в песочницу без единого из ваших аддонов. А -tickrate лучше задать, чем унаследовать: источники расходятся в том, какое значение у Garry's Mod по умолчанию, так что впишите число в стартовую строку и перестаньте гадать. 33 - разумный минимум для песочницы с множеством пропов, 66 - для всего, где важно прицеливание. Удвоение tick rate примерно удваивает затраты CPU на игрока и ничем не помогает серверу, который и так отстаёт; более подробно этот довод изложен в статье что на самом деле значит tick rate.

Если сервер вообще не появляется в браузере, проверьте не только порт, но и Game Server Login Token. Токены создаются для app id 4000 (Garry's Mod) и задаются через sv_setsteamaccount; в статье токены игровых серверов Steam объясняется, что это такое, как их банят и почему нужен один токен на сервер.

server.cfg и лимиты песочницы#

garrysmod/cfg/server.cfg выполняется при каждой загрузке карты. Разумный стартовый файл:

garrysmod/cfg/server.cfg
hostname "Prop hunt, Thursdays, no minges"sv_password ""rcon_password "long-random-string"sv_lan 0sv_region 3sv_allowcslua 0sv_kickerrornum 10sv_allowdownload 1sv_allowupload 0sv_downloadurl "https://files.example.com/gmod/"net_maxfilesize 64sbox_maxprops 150sbox_maxragdolls 5sbox_maxnpcs 10sbox_maxeffects 50sbox_maxvehicles 6sbox_maxthrusters 30sbox_maxwheels 30sbox_maxdynamite 10sbox_godmode 0sbox_noclip 1sbox_playershurtplayers 1gmod_physiterations 4

Гадать о значениях по умолчанию не нужно: наберите любой cvar в консоли сервера отдельно, и он выведет текущее значение и то, с которым поставлялся. Некоторые из них весят больше, чем следует из названий:

  • sv_allowcslua 0 не даёт клиентам запускать на вашем сервере произвольный клиентский Lua. Оставьте 0. Каждое руководство, которое советует поставить 1, - руководство для тестового ящика на одного игрока.
  • sv_kickerrornum отключает клиента после указанного числа ошибок Lua. Иначе клиент с неисправным аддоном порождает тысячи строк ошибок в минуту и хоронит под ними всё полезное в консоли.
  • sbox_maxprops - это разница между сервером-песочницей и слайд-шоу. Стоимость физики пропов нелинейна: один игрок, сварящий сотню бочек, обходится дороже, чем десять игроков по десять пропов.
  • gmod_physiterations повышает точность физики за прямо пропорциональную цену в CPU. Не повышайте его, чтобы справиться с лагами; это противоположность исправления.
  • sv_region задаёт, в каком разделе браузер размещает ваш сервер. 3 - Европа.

Настройки для отдельных карт кладутся в garrysmod/cfg/<mapname>.cfg и выполняются после server.cfg при загрузке этой карты. Это чистый способ задать одной карте другие лимиты пропов без плагина.

Порты и подключение#

ПортПротоколНазначение
27015UDPИгровой трафик и запросы Steam
27015TCPRCON, если задан -usercon
27020UDPSourceTV, если вы его включаете
27005UDPИсходящий клиентский порт, на сервере открывать нечего

Source использует один и тот же номер для игрового трафика и запросов браузера серверов, поэтому Garry's Mod нужно меньше выделений, чем DayZ или Arma. Тарифы Garry's Mod у нас идут с одним выделением, а дополнительные порты добавляются на вкладке Network, когда вы захотите SourceTV или второй сервер.

Игроки, не нашедшие сервер в браузере, всегда могут подключиться напрямую из консоли командой connect 203.0.113.10:27015. Это же самая быстрая диагностика: если прямое подключение работает, с сервером всё в порядке, а проблема в листинге - отсутствует токен, неверный регион или сам браузер остаётся браузером. В статье порты игровых серверов простыми словами в общем виде разобрано различие между портом запросов и игровым портом, а безопасная работа с RCON стоит пяти минут, прежде чем вы впишете пароль в этот файл, потому что rcon_password через интернет - протокол открытым текстом с единственным секретом.

Коллекции Workshop, FastDL и недостающий контент#

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

Есть три отдельных пути доставки контента, и рабочий сервер обычно использует все три.

скачивается при запускесписок workshop при входеsv_downloadurlесть у игрокаКоллекция Workshophost_workshop_collectionВеб-хост FastDLbz2 filesПодключённая играконтент CS:SСервер GModresource.AddWorkshopИгрок
Три пути контента к игроку

Коллекция Workshop - для аддонов. Создайте одну коллекцию, сделайте её публичной, впишите её идентификатор в host_workshop_collection и добавьте -authkey. Сервер скачает аддоны себе. Чтобы их скачивали и клиенты, перечислите их в Lua:

garrysmod/lua/autorun/server/workshop.lua
resource.AddWorkshop("1234567890")resource.AddWorkshop("1234567891")

FastDL - для всего, что не является аддоном Workshop: старые карты, звуки, пользовательские модели, брошенные в игровой каталог. Задайте sv_downloadurl веб-сервера, где лежит копия структуры папок вашего garrysmod, причём каждый файл сжат bzip2. Без него клиенты качают через игровой порт с такой скоростью, что кажется, будто всё сломано. С ним они качают так быстро, как способен отдавать веб-хост. Полный рецепт, включая структуру папок и шаг сжатия, - в статье коллекции Workshop и FastDL.

Подключённые игры - случай, который вы исправить не можете. Многие карты от сообщества делались с текстурами Counter-Strike: Source. Если у игрока нет CS:S или она не установлена, он видит фиолетово-чёрные шахматные клетки и модели ERROR, и ничто на сервере этого не изменит: garrysmod/cfg/mount.cfg подключает контент, который уже есть на машине, а не создаёт лицензию. Либо выбирайте карты, использующие только контент Half-Life 2, либо прямо напишите в MOTD, что людям нужно.

Режимы игры, админы и DarkRP#

Режим игры - это папка в garrysmod/gamemodes/, и имя папки - то, что вы передаёте в +gamemode. На этом спотыкаются почти все, кто впервые ставит DarkRP: DarkRP кладётся в `garrysmod/gamemodes/darkrp`, а не в `addons`, тогда как darkrpmodification - папка, которую вы и должны править, - лежит в garrysmod/addons/darkrpmodification. Положите любую из них не туда, и сервер загрузится в песочницу и не выведет ничего очевидно неправильного. О профессиях, сущностях и системе денег рассказано в статье запуск сервера DarkRP.

Для администрирования бесплатный стандарт - ULX с ULib: оба являются аддонами, а ULib хранит список пользователей в garrysmod/data/ulib/users.txt. Админы пользуются внутриигровым меню через !menu, а первого суперадмина можно назначить, отредактировав этот файл при остановленном сервере, если админов ещё нет. SAM и ServerGuard - платные альтернативы с лучшими интерфейсами и меньшими накладными расходами; на загруженном сервере накладные расходы имеют реальное значение, потому что админ-моды подключаются к чату, спавну и урону.

Что бы вы ни использовали, настройте это до того, как кого-то приглашать. Немодерируемый сервер Garry's Mod находит своего первого спамера пропами в течение суток, а инструменты против него бесполезны, если поставлены постфактум. Остальная часть этой работы - откуда берутся аддоны и что проверить, прежде чем запускать чужой Lua в корне вашего игрового цикла, - описана в статье как держать сервер с модами в чистоте.

Производительность: куда уходит тик#

Большинство режимов игры нормально работают при том числе игроков, на которое рассчитаны, и разваливаются выше него, потому что цикл Lua по каждому игроку дёшев при двенадцати и дорог при сорока. Если сервер тормозит только когда заполняется, искать надо сначала в списке аддонов, а не в тарифе.

Короткий порядок диагностики, который работает:

  1. status в консоли: сколько игроков и нет ли среди них кого-то с ужасным пингом, когда у остальных всё в порядке.
  2. stats - fps сервера и CPU. Если fps равен tick rate, а столбец CPU низкий, проблема не в сервере.
  3. Следите за ошибками Lua в консоли. Один аддон, дающий ошибку внутри хука Think, запускает свой обработчик ошибок тридцать три раза в секунду на каждого игрока. Ошибки называют путь аддона; обычно это и есть всё расследование. В статье как читать консоль больше о том, что оставлять, а что игнорировать.
  4. Уберите половину коллекции на тестовом сервере и измерьте снова. Деление списка аддонов пополам - занятие непритязательное, но это единственный метод, который надёжно находит виновника.

Две структурные вещи помогают больше настройки. Держите лимиты пропов и сущностей достаточно низкими, чтобы игроки не могли по случайности сделать сервер неиграбельным: sbox_maxprops плюс таймер очистки при отключении - это большая часть дела. И перезапускайте по расписанию. Серверы Garry's Mod за дни накапливают сущности, таймеры и память; ночной перезапуск, когда никого нет, ничего не стоит и держит время кадра ровным. Интервал описан в статье расписания перезапусков, которые помогают, а вкладка Schedules на панели запускает его по выражению cron.

Кстати, пустой сервер почти ничего не делает: srcds засыпает, когда уходит последний игрок, так что простаивающий сервер Garry's Mod едва заметен на графике CPU. Если ваш заметен, что-то в списке аддонов запускает таймер независимо от того, есть ли кто-то на сервере, и это стоит найти.

Диагностика проблем#

Сервер запускается, но моих аддонов на нём нет. Отсутствует или недействителен -authkey, либо коллекция не публичная. Проверьте в загрузочном логе строки о скачивании Workshop.

Игроки появляются с моделями `ERROR` и шахматными текстурами. На клиенте не хватает контента. Аддонам Workshop нужен resource.AddWorkshop; старому контенту нужен FastDL; контент CS:S требует, чтобы у игрока была CS:S.

Все качают две минуты, и половина уходит. Нет sv_downloadurl, поэтому файлы сочатся через игровой порт. Настройте FastDL.

Сервер падает с ошибкой нехватки памяти, а память выглядит свободной. Дело в 32-разрядном адресном пространстве, а не в вашем тарифе. Сократите коллекцию или перейдите на ветку x86-64.

Отключения «Reliable channel overflowed». Аддон отправляет клиентам слишком много данных за раз, обычно при спавне. Найдите его, убирая аддоны; консоль клиента называет последнее, что он получил.

Бинарный модуль перестал работать после обновления. Модули в garrysmod/lua/bin/ компилируются под платформу и под ветку. Переход на 64 бита или обновление Garry's Mod, меняющее среду выполнения, требуют подходящей сборки каждого модуля. Общий случай - в статье когда обновление мода всё сломало.

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

FAQ#

Сколько RAM нужно серверу Garry's Mod?

1-2 GB для песочницы с небольшой коллекцией, 2-3 GB для режимов с раундами и 4-6 GB для DarkRP или большой коллекции Workshop. Память определяется коллекцией куда сильнее, чем числом игроков, а 32-разрядный бинарник не может использовать заметно больше 3-4 GB в любом случае.

Нужно ли игрокам владеть аддонами с моего сервера?

Нет. Аддоны Workshop, перечисленные через resource.AddWorkshop, клиент скачивает автоматически. Иметь им, возможно, придётся другую игру Valve, контент которой использует карта, чаще всего Counter-Strike: Source, и никакая серверная настройка не может дать им это.

Почему мой сервер не отображается в браузере серверов?

В порядке вероятности: порт запросов недоступен, не задан Game Server Login Token, sv_lan равен 1 или браузер попросту медленный. Проверьте командой connect <ip>:27015 в консоли клиента; если она работает, сломан только листинг.

Стоит ли запускать 64-разрядную ветку?

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

Стоит ли платить за более высокий tick rate?

Редко. Переход с 33 на 66 стоит примерно вдвое больше CPU на игрока и помогает только в режимах, где важна точность стрельбы. Сервер, который уже отстаёт по времени кадра, от этого станет хуже, а не лучше.

Как не дать людям создавать тысячу пропов?

Понизьте sbox_maxprops и связанные лимиты sbox_max*, держите sv_allowcslua равным 0 и поставьте админ-мод с командой очистки, прежде чем открывать сервер для посторонних. Лимиты, выставленные после первого инцидента, - утешение, а не профилактика.


Комментарии

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

0/2000