У сервера Factorio есть одно число производительности, и это UPS: обновлений в секунду, целевое значение 60. Ниже 60 замедляется сама игра - конвейеры движутся медленнее, печи плавят медленнее, часы в углу отстают от реального времени - у всех подключённых, и никакая пропускная способность или память этого не исправят. UPS определяется тем, сколько длится один тик симуляции на одном ядре процессора, а моды - самый быстрый способ этот тик удлинить. В этой статье разобрано, как правильно ставить моды на headless-сервер, правило, на котором спотыкаются все (у каждого клиента один и тот же список), что на самом деле съедает бюджет тика и как измерять сохранение, а не гадать.
Важен UPS, а не FPS#
Factorio запускает симуляцию с фиксированной частотой 60 обновлений в секунду. Это даёт серверу 16,67 миллисекунды, чтобы один раз обновить все сущности на всех поверхностях. Если он справляется за 9 мс, игра идёт на 60 UPS с запасом. Если тратит 22 мс, игра идёт примерно на 45 UPS, и всё в мире происходит на три четверти обычной скорости.
FPS - это отдельное число на стороне клиента: как часто ваша машина рисует мир. У headless-сервера рендерера нет вовсе, так что и FPS нет. Это первое, что надо установить, когда кто-то говорит, что сервер лагает, потому что у трёх типичных жалоб три разные причины:
- Всё медленное, у всех, включая часы. Это UPS. Сервер не успевает симулировать.
- У меня игра дёргается, но фабрика работает нормально. Это клиентский FPS, на их машине.
- Мой персонаж откатывается назад, у остальных всё в порядке. Это их соединение, а не сервер.
То же различие проходит через статью что на самом деле значит tick rate про другие игры. Factorio необычна только тем, что частота симуляции и ощущение времени в игре - одно и то же, поэтому потеря UPS - это потеря настоящей скорости, а не плавности.
Поскольку цикл обновления по сути однопоточный, поднять UPS может только более быстрое ядро. Добавление vCPU в тариф Factorio даёт запас для сохранения, сети и случайных фоновых задач, и больше ничего. Это самый чёткий пример мысли из статьи CPU или RAM для игровых серверов: они не взаимозаменяемы, и узким местом является только одно из двух.
Установка модов на headless-сервер#
Моды - это zip-файлы в каталоге mods/ установки, названные строго Name_Version.zip: Krastorio2_1.4.0.zip, а не Krastorio2.zip и не Krastorio2 (1).zip. Версия в имени файла должна совпадать с версией внутри info.json мода, потому что именно по ней Factorio разрешает зависимости.
/opt/factorio/mods/ mod-list.json mod-settings.dat Krastorio2_1.4.0.zip flib_0.15.0.zip stdlib_1.4.6.zipВ headless-сборке нет браузера модов, так что практических путей два. Скачать zip-файлы с mods.factorio.com в браузере и загрузить их либо - способ, который действительно масштабируется, - собрать список модов в одиночной игре на своей машине, где встроенный менеджер сам разрешает зависимости, и затем скопировать всю папку mods на сервер. Загрузка по SFTP или через файловый менеджер - одна и та же работа в обоих случаях; в статье SFTP и файловый менеджер есть параметры подключения, если вы этого раньше не делали.
Зависимости объявляются в info.json каждого мода, и сервер отказывается запускаться, если какой-то не хватает, выводя имя и диапазон версий, который ему был нужен. Эта ошибка - самое полезное, что есть в логе при установке модов, так что читайте её, а не переустанавливайте всё подряд. Ведущий ? в зависимости означает необязательную, ! - несовместимую, а ~ - что мод обязателен, но не влияет на порядок загрузки.
Моды кладутся в одну и ту же папку, где бы вы ни размещались. На RE:NODE папка mods существует с первой загрузки, а моды попадают прямо в неё по SFTP или через файловый менеджер в браузере, который к тому же распаковывает архивы на месте.
mod-list.json, версии и mod-settings.dat#
mods/mod-list.json определяет, какие из имеющихся zip-файлов на самом деле загружаются. Его пишет игра, и его безопасно править вручную:
{ "mods": [ { "name": "base", "enabled": true }, { "name": "elevated-rails", "enabled": true }, { "name": "quality", "enabled": true }, { "name": "space-age", "enabled": true }, { "name": "flib", "enabled": true }, { "name": "Krastorio2", "enabled": false } ]}Стоит заметить две вещи. base - это тоже мод, и он всегда есть в списке. А дополнение Space Age поставляется тремя отдельными модами - space-age, quality и elevated-rails, - которые можно включать независимо, так что сервер может запускать возвышенные рельсы без всего остального.
Отключить мод здесь - не то же самое, что удалить zip. Отключённые моды всё равно проверяются на конфликты версий при старте, но не загружаются. Удаление мода с контентом, который уже используется в сохранении, - это другая и гораздо более опасная операция, о ней ниже.
mods/mod-settings.dat хранит настройки всех модов. Это бинарный файл, поэтому текстовым редактором его не отредактируешь, а в headless-сервере нет графического интерфейса настроек. Единственный разумный способ изменить стартовую настройку - загрузить тот же набор модов в одиночной игре на своей машине, выставить всё там и загрузить получившийся mod-settings.dat. Глобальные настройки времени выполнения админ может менять в игре; стартовые настройки нельзя менять без перезапуска, потому что они изменяют прототипы.
Синхронизация модов, рассинхроны и правило одинакового списка#
В Factorio нет понятия мода только для клиента. Каждый мод - часть симуляции: даже тот, что добавляет лишь GUI, запускает Lua, который все машины должны выполнять одинаково, - поэтому у сервера и у каждого клиента должны быть одни и те же моды одних и тех же версий и с одними и теми же стартовыми настройками. Игра это проверяет: несовпадение отклоняется при входе, со списком того, что различается.
Звучит хуже, чем есть, потому что клиент исправит это сам. Когда игрок заходит на сервер с модами, игра предлагает скачать и включить ровно то, что стоит на сервере, прямо с официального портала модов, и отключить всё лишнее. В двух случаях это не срабатывает: моды, которых нет на портале, - личный скрипт, мод из релиза на GitHub, - и моды, которые убрали с портала после того, как вы их установили. Их приходится раздавать вручную.
Рассинхроны - оборотная сторона детерминизма. Если симуляция одной машины расходится с серверной, Factorio это замечает, отключает клиента, пишет отчёт о рассинхроне и заставляет его заново скачать карту. В ванили это достаточно редко, чтобы считаться ошибкой, о которой стоит сообщить. С модами это обычно мод, делающий что-то недетерминированное, и игра часто говорит об этом прямо в логе: например, вызов math.random() вне события недопустим именно потому, что разные машины получили бы разные числа.
Если какой-то мод раз за разом вызывает рассинхрон у одного игрока, полезная информация лежит в отчёте о рассинхроне, который пишет игра, и прочитать его может автор мода. Что вы можете сделать со стороны сервера, так это убедиться, что у всех одинаковые версии модов, и не позволять модам обновляться у вас из-под ног - это довод в пользу их закрепления, о нём ниже.
Что на самом деле стоит UPS#
Бюджет тика тратится почти целиком на обновление активных сущностей. Всё, что спит, почти бесплатно: Factorio активно отправляет в сон простаивающие манипуляторы, машины и конвейеры. Поэтому вопрос никогда не в том, «насколько велика моя база», а в том, «сколько вещей что-то делает в каждом тике».
| Что стоит | Почему | Что помогает |
|---|---|---|
| Логистические роботы | Каждый летящий бот обновляется каждый тик, плюс зарядка | Конвейеры или прямая вставка при больших объёмах |
| Радары | Непрерывное сканирование секторов, на каждый радар | Держите два-три, а не тридцать |
| Комбинаторы | Каждый обновляется каждый тик, всегда | Тактовые генераторы и триггеры вместо арифметики каждый тик |
| Кусаки и загрязнение | Диффузия по чанкам, поиск пути при атаке | Меньше и крупнее стены; сократите экспансию |
| Поезда | Дёшевы, пока едут, дороги при перепрокладке маршрута | Меньше и длиннее составы; проще развязки |
| Число сущностей вообще | Всё перечисленное, умноженное | Маяки и модули, чтобы меньше машин делали больше |
| Дополнительные поверхности | Каждая поверхность симулируется всё время | Не держите мёртвые платформы и ненужные планеты |
Три пункта заслуживают большего, чем строка таблицы.
Боты против конвейеров. Логистическая сеть, которая перевозит тысячу предметов в секунду ботами, делает за тик гораздо больше работы, чем набор конвейеров, перевозящих то же самое: каждый бот - отдельная сущность с положением и состоянием заряда, а конвейеры используют высокооптимизированное представление транспортных линий, где сжатая цепочка предметов почти бесплатна. Боты великолепны для строительства, для логистики с малой пропускной способностью и для всего нерегулярного. Для главной шины они не подходят. Прямая вставка - от машины к машине, без конвейера и без бота вообще - дешевле обоих вариантов.
Маяки и продуктивность. Самая дешёвая сущность - та, которой нет. Двадцать сборщиков с маяками, выпускающих столько же, сколько восемьдесят без них, - это не просто экономия места: это шестьдесят сущностей, которые не обновляются, шестьдесят лишних манипуляторов и более короткая сеть конвейеров. Поэтому мегабазы выглядят так, как выглядят.
Lua в модах. Мод, который регистрирует обработчик события каждого тика и делает в нём настоящую работу, платит эту цену шестьдесят раз в секунду вечно - сверх сущностей, которые он добавляет. Сборки-оверхолы в этом отношении обычно написаны хорошо; маленькие моды для удобства - те самые, что тихо съедают по 2 мс на тик. Бенчмарк ниже покажет, какой именно, потому что можно прогнать одно и то же сохранение с модом и без.
Измерение флагом benchmark#
Гадать - пустая трата вечера. Headless-сборка может прогнать сохранение так быстро, как позволяет процессор, без клиентов и без рендеринга, и сообщить, сколько длился тик:
$ cd /opt/factorio$ ./bin/x64/factorio --benchmark ./saves/world.zip \ --benchmark-ticks 2000 --benchmark-runs 3 \ --benchmark-verbose all --mod-directory ./mods--benchmark-ticks - сколько тиков симулировать, --benchmark-runs повторяет весь прогон, чтобы видеть разброс, а --benchmark-verbose all добавляет разбивку по системам: обновление сущностей, транспортные линии, схемная сеть, поезда, электросеть, жидкости, роботы и остальное. --mod-directory позволяет указать другую папку с модами, и именно так проверяется «сколько мне стоит этот мод»: прогоните сохранение дважды с двумя папками.
Читайте среднее число миллисекунд на тик относительно бюджета 16,67 мс. До 10 мс - спокойно. От 12 до 16 мс сервер удержит 60 UPS на тихой машине и просядет ниже, когда что-то ещё на ней занято. Больше 16,67 мс - игра уже идёт медленно.
Две оговорки. Бенчмарк прогоняет сохранение детерминированно вперёд, так что измеряет фабрику, а не игроков; двенадцать человек, открывающих карту и ставящих чертежи, добавляют работу, которую он не увидит. И бенчмарк на вашем настольном компьютере говорит о процессоре вашего компьютера, а не сервера. Запускайте его на машине, где будет размещена карта, если можете: консоль панели примет команду, потому что это тот же бинарник.
В графическом клиенте F4 открывает отладочные настройки, а F5 переключает отладочный оверлей, где панель использования времени показывает ту же разбивку по системам вживую. При подключении к многопользовательской игре она показывает работу вашей собственной машины, но значение UPS общее.
Сборки-оверхолы, Space Age и память#
Крупные пакеты модов полностью меняют разговор о размерах. Krastorio 2, Bob's и Angel's, Industrial Revolution 3, Pyanodons и различные космические оверхолы добавляют прототипы, рецепты, а часто и целые новые поверхности. Эффект для сервера тройной: игра дольше загружается при старте, потребление памяти растёт навсегда, а тик дорожает на каждую сущность, потому что в игре больше типов сущностей.
Space Age - это официальная версия того же самого. Каждая освоенная планета - ещё одна поверхность, которая симулируется, когда на ней что-то активно, а платформа в полёте - ещё одна. Игра Space Age с пятью поверхностями ближе к запуску пяти серверов, чем одного, и 4-6 GB - это реалистичная цифра, а не щедрая.
Память ведёт себя иначе, чем UPS, и люди их путают. Больше памяти не повышает частоту обновлений. Она даёт возможность держать карту побольше, больше поверхностей и больше прототипов модов, не давая контейнеру упереться в лимит и быть остановленным. К тому же при сохранении Factorio на мгновение нужно больше памяти, чем при работе, поэтому сервер, который час чувствует себя нормально, умирает именно на автосохранении. На RE:NODE достижение лимита памяти останавливает контейнер и запускает его заново начисто, а не даёт уйти в своп, и для такой игры это правильное поведение - но перезапуск посреди тика стоит вам всего, что сделано после последнего автосохранения, так что размер лучше брать с запасом над пиком, а не впритык. Общая версия этой оценки - в статье когда пора менять тариф.
Прежде чем вкладываться в долгую игру на сборке, проверьте, какую версию игры она поддерживает. Переписывание в версии 2.0 сломало очень много модов, а некоторые крупные сборки возвращались долго; карта, начатая на моде, который потом забросили, - это карта, которую нельзя обновить.
Как вернуть UPS замедляющемуся серверу#
Примерно в порядке того, сколько каждый пункт возвращает при затраченных усилиях:
- Сначала бенчмарк. Выясните, какая система дорогая, прежде чем что-то менять. Половина всей «оптимизации» в Factorio направлена не на ту подсистему.
- Удалите лишние радары. Горстки радаров, покрывающих базу, достаточно. Тридцать, разбросанных по карте ради обзора, - это реальная цена без пользы для игры; используйте метки на карте и несколько разведанных чанков.
- Сократите простаивающих ботов. Посмотрите на вкладку логистической сети: дороже всего боты, которые постоянно находятся в воздухе. Сокращение числа роботопортов в сети или замена высокопроизводительной связи на ботах конвейером сдвигает стрелку.
- Отключите то, чем не пользуетесь. Отключите экспансию врагов в
map-settings.jsonили играйте в мирном режиме, если игра с кусаками не в центре вашего забега. Диффузия загрязнения и поиск пути на большой загрязнённой карте по-настоящему дороги. - Поставьте маяки и модули на крупные производственные блоки. Меньше машин, делающих больше, - структурное решение.
- Посмотрите на спагетти из комбинаторов. Арифметика каждый тик на сотнях комбинаторов складывается. Привяжите её к тактовому генератору.
- Перезапускайте сервер раз в неделю. Это не исправление UPS, но держит память ровной и даёт чистую точку сохранения. Это умеет вкладка Schedules - см. расписания перезапусков, которые помогают.
И на этом остановитесь. Серверу, который держит 60 UPS с запасом в 6 мс, оптимизация не нужна, а перестраивать работающую базу ради числа, которое никто не способен заметить, - верный способ, которым группы теряют интерес к карте. Оптимизируйте, когда часы начинают отставать, а не раньше.
Если UPS в порядке, а сервер всё равно ощущается неправильно, проблема в другом месте: шумный сосед на общем оборудовании, сетевой путь с джиттером или клиент, который не справляется. Первое разобрано в статье общий CPU и шумные соседи, второе - в статье задержка, джиттер и потеря пакетов.
Обновление модов без поломки сохранения#
Моды на портале обновляются, когда их авторы публикуют новые версии, а файла блокировки зависимостей нет. На сервере, где это важно, относитесь к папке модов как к закреплённому состоянию:
- Прежде чем что-то трогать, сделайте бэкап сохранения и копию всей папки
mods. Бэкап, который никто не восстанавливал, - гипотеза, так что время от времени восстанавливайте его; подробнее - в статье бэкапы, которые действительно восстанавливаются. - По возможности обновляйте по одному моду и читайте его список изменений на предмет заметок о миграции.
- Запустите сервер и следите за логом на протяжении загрузки. Скрипты миграции выполняются один раз, при первой загрузке после обновления, и именно ошибки в них портят сохранения.
- Скажите игрокам синхронизироваться с сервера, а не обновляться с портала самим, чтобы версии не разошлись.
Когда обновление мода всё же ломает карту, исправление почти всегда - вернуть старый zip, а не удалять мод. Полная процедура описана в статье что делать, когда обновление мода всё сломало, а гигиена, которая избавляет от такой необходимости, - в статье как держать сервер с модами в чистоте.
FAQ#
Сколько модов может запускать сервер Factorio?
Предела нет, а сам счёт - неверная мера. Пятьдесят небольших модов для удобства могут стоить меньше, чем одна сборка-оверхол. Важно, сколько сущностей в получившейся карте и сколько Lua выполняется каждый тик, а это флаг benchmark покажет за минуту.
Почему мой сервер на 45 UPS, когда график CPU показывает 40%?
Потому что график усредняет по ядрам. Factorio использует для симуляции одно из них, и оно загружено на 100%. Тариф с четырьмя ядрами при однопоточной нагрузке всегда будет выглядеть недогруженным, будучи при этом полностью насыщенным.
Нужно ли игрокам самим устанавливать моды?
Нет, если моды есть на официальном портале. При входе клиент предлагает скачать и включить ровно то, что запускает сервер, и отключить всё лишнее. Моды не с портала приходится отправлять игрокам вручную.
Можно ли добавить мод в уже идущую карту?
Добавлять обычно безопасно, удалять - нет. Контент нового мода просто появляется. Удаление мода стирает все сущности, которые он давал, навсегда. Перед тем и другим сделайте бэкап сохранения и никогда не удаляйте сборку-оверхол из живой карты.
Повышает ли UPS больше RAM?
Нет. Память позволяет серверу держать более крупную карту, не будучи убитым; тик от неё не становится короче. Это делает только более быстрое ядро процессора или более дешёвая фабрика.
Какой UPS реалистичен для большой базы?
Шестьдесят, и проектировать нужно так, чтобы его удерживать. Серьёзные мегабазеры мирятся с меньшим, потому что гонятся за показателем производства, но для группы, играющей вместе, в тот момент, когда часы замедляются, игра перестаёт ощущаться правильно, так что считайте 60 UPS ограничением и стройте в его рамках.




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