RE:NODE

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

Лаги сервера Project Zomboid: причины и решения

Почему лагает сервер Project Zomboid и как это исправить: популяция зомби, разбредшиеся игроки, куча Java, предметы на земле, трупы, резервные копии и моды.

0 прочтений

Сервер Project Zomboid лагает по одной из пяти причин, и их легко различить, если знать, куда смотреть. Слишком много живых зомби в загруженных областях. Игроки разбрелись по карте, и сервер держит активными сразу несколько районов. Куча Java слишком мала, и сервер тратит время на сборку мусора - или слишком велика для тарифа, и контейнер останавливается на лимите памяти. Тысячи предметов и трупов, которые никто не убирает. Или что-то периодическое: сохранение мира, zip-копия большой папки сохранения или мод, выполняющий тяжёлую Lua-работу по таймеру. «Лаги», которые видят только некоторые игроки, пока у остальных всё нормально, обычно вообще не связаны с сервером.

В этом руководстве разобрано, на что сервер Zomboid тратит время, как понять, какая из пяти проблем у вас, и какие настройки исправляют каждую. Общий файл настроек описан в статье настройки сервера Project Zomboid, а параметры песочницы по одному объясняются в статье SandboxVars в Project Zomboid.

На что тратит время сервер Zomboid#

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

Из этого вытекают два следствия, которые определяют всё остальное.

Разброс стоит дороже количества. Десять игроков в одном городе загружают одну область. Четыре игрока в четырёх городах загружают четыре области, у каждой свои зомби и объекты. Поэтому число игроков плохо предсказывает нагрузку Zomboid в обе стороны, и поэтому один и тот же сервер может нормально работать в субботу и мучиться в воскресенье с теми же людьми онлайн.

Часть работы делают клиенты. В мультиплеере Build 41 большая часть передвижения зомби рядом с игроком вычисляется на машине этого игрока и синхронизируется через сервер. Это облегчает сервер, но означает, что игрок со слабым ПК или плохим соединением может заставить зомби рядом с собой дёргаться и телепортироваться для всех, кто стоит поблизости, хотя нагрузка на сам сервер выглядит нормально.

Сервер - это процесс Java, и основная симуляция опирается на один поток, поэтому быстрое ядро важнее множества медленных. Второе ядро всё равно помогает, потому что сохранение, сеть и сборка мусора идут параллельно.

Как понять, какая у вас проблема#

Прежде чем менять настройки, потратьте вечер на наблюдение. У хостера с панелью есть три полезных источника: графики памяти и CPU относительно ваших лимитов, живая консоль и Zomboid/server-console.txt, где лежит полный вывод текущего запуска.

СимптомВероятная причинаКуда смотреть
Лагает у всех сразу, всё времяCPU упёрся в лимитГрафик CPU прижат к доле тарифа
Лагает у всех сразу, каждые несколько минутСохранения, резервные копии или мод по таймеруЛаги совпадают с сообщениями о сохранении или копии
Подёргивания усиливаются день ото дня и исчезают после перезапускаДавление на кучу или накоплениеГрафик памяти стабильно растёт
Сервер внезапно перезапускается без ошибкиДостигнут лимит памятиПрямо перед этим график памяти на лимите
Зомби телепортируются только рядом с одним игрокомПК или соединение этого игрокаСпросите, кто рядом; проверьте его пинг
Лаги, когда игроки разбредаютсяСлишком много загруженных областейСопоставьте с тем, где находятся люди
Лаги в одном месте, например на базеПредметы, трупы или сложная постройка тамСходите и посмотрите

Консоль также показывает java.lang.OutOfMemoryError, если заканчивается сама куча, - это другой сбой, не тот, что с лимитом контейнера, и он указывает на слишком маленький для мира -Xmx.

Различие, за которое стоит держаться: лаги, которые все видят в один и тот же момент, - это сервер. Лаги, которые видит один игрок или которые ходят за одним игроком, - это клиент или соединение. Статья задержка, джиттер и потеря пакетов - самый быстрый способ объяснить игроку, что из этого у него.

Куча Java: настройка, которую большинство серверов выставляет неправильно#

Память сервера задаётся в ProjectZomboid64.json в установке сервера, а не в ini:

ProjectZomboid64.json
{    "mainClass": "zombie/network/GameServer",    "classpath": ["."],    "vmArgs": [        "-Djava.awt.headless=true",        "-Xms3g",        "-Xmx6g",        "-XX:+UseZGC"    ]}

В настоящем файле аргументов больше; меняйте только значения -Xms и -Xmx, а остальное не трогайте. Последние релизы Build 41 поставляются с уже выбранным сборщиком мусора ZGC, который держит паузы короткими; если в вашем файле другой сборщик, оставьте его как есть, если не знаете, зачем его меняете.

Ошибиться с кучей можно двумя способами:

Слишком маленькая. Куча заполняется, сборщик мусора постоянно работает, освобождая место, и сервер тратит время на уборку вместо симуляции. Вы видите регулярные подёргивания, которые усиливаются по мере роста мира, а в итоге - OutOfMemoryError.

Слишком большая для тарифа. Куча - это не весь процесс. Стеки потоков, собственные структуры JVM и нативная память находятся вне её, а лимит контейнера учитывает всё. Выставьте -Xmx равным тарифу, и процесс перерастёт свой контейнер, пока Java ещё считает, что место есть. В RE:NODE контейнер тогда останавливается и перезапускается начисто, а не уходит в своп, так что вы видите резкий перезапуск без ошибки в логе - и без сохранения.

Память тарифаРазумный -XmxТипичный сервер
3 GB2g2-4 игрока, ваниль, одна область
4 GB3gНебольшая группа, несколько модов
6 GB4g - 5g8-16 игроков, разбредаются
8 GB6g16-32 игрока, моды и моды карт
10 GB7g - 8gБольшой публичный сервер с модами

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

Популяция зомби#

Зомби в загруженных областях - самая большая статья расходов симуляции, а популяция управляется в файле песочницы:

servertest_SandboxVars.lua
SandboxVars = {    Zombies = 4,    ZombieConfig = {        PopulationMultiplier = 1.0,        PopulationStartMultiplier = 1.0,        PopulationPeakMultiplier = 1.5,        PopulationPeakDay = 28,        RespawnHours = 72.0,        RespawnMultiplier = 0.1,        RedistributeHours = 12.0,        FollowSoundDistance = 100,        RallyGroupSize = 20,    },}

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

Как снизить нагрузку, не сделав игру пустой:

  • Снижайте пик, а не старт. PopulationPeakMultiplier на 1.2 вместо 1.5 сохраняет напряжение в начале и сглаживает поздние недели.
  • Уменьшите или выключите респавн. Респавн заново наполняет зачищенные области, и число зомби в загруженных областях остаётся высоким всю жизнь сервера. RespawnHours = 0 полностью его отключает.
  • Группы сбора поменьше. RallyGroupSize управляет тем, сколько зомби собирается вместе при миграции. Очень большие орды, сходящиеся к базе, - это всплеск, который сервер чувствует.

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

В ini-файлах поздних версий Build 41 есть также ZombieUpdateMaxHighPriority, ZombieUpdateDelta, ZombieUpdateRadiusLowPriority и ZombieUpdateRadiusHighPriority, которые управляют тем, как часто и на каком расстоянии состояние зомби синхронизируется с клиентами. Они обменивают плавность на трафик и CPU. Оставьте значения, которые сгенерировал ваш сервер, если только вы не измерили проблему, которую они исправили бы, и меняйте их по одному.

Игроки, машины и разброс#

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

КлючФайлЧто делает
SpeedLimitiniМаксимальная скорость машин в мультиплеере. Быстрая езда быстро загружает новые чанки
CarEngineAttractionModifieriniКак далеко шум двигателя привлекает зомби
MaxPlayersiniСлоты. Меньше людей - меньше разброс
PauseEmptyiniОстанавливает мир, когда никого нет

SpeedLimit существует во многом из-за подгрузки чанков. Игрок, едущий на полной скорости, пересекает чанки быстрее, чем сервер спокойно успевает их загружать, и это выглядит как подёргивания у водителя и нагрузка для всех. Значение по умолчанию - сознательный компромисс; если его поднять, поездки через всю карту станут хуже.

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

Предметы, трупы и накопление#

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

НастройкаФайлПо умолчаниюЧто делает
HoursForCorpseRemovalsandbox216.0Игровых часов до исчезновения трупов. 0 - оставлять их
HoursForWorldItemRemovalsandbox24.0Игровых часов до удаления перечисленных предметов с пола
WorldItemRemovalListsandboxкороткий списокТипы предметов, к которым применяется удаление
ItemRemovalListBlacklistTogglesandboxfalsetrue превращает список в «всё, кроме этих»
ItemNumbersLimitPerContainerini0Ограничивает число предметов в контейнере. 0 - без ограничений
BloodSplatLifespanDaysini0Дней до исчезновения пятен крови. 0 - оставлять их

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

WorldItemRemovalList с ItemRemovalListBlacklistToggle в значении true удаляет все предметы с пола, кроме перечисленных, и чистит агрессивно. Заодно он удаляет то, что игроки положили на пол намеренно, так что предупредите об этом.

ItemNumbersLimitPerContainer существует для любителя складывать по четыре тысячи гвоздей в один ящик. Контейнер с огромным списком предметов дорого обходится каждый раз, когда его кто-то открывает или чанк сохраняется.

Сохранения, резервные копии и периодические подёргивания#

Подёргивания с регулярным интервалом почти всегда означают, что сервер пишет на диск.

servertest.ini
SaveWorldEveryMinutes=15BackupsPeriod=0BackupsOnStart=trueBackupsCount=5

SaveWorldEveryMinutes записывает мир по таймеру; 0 оставляет сохранение на собственный ритм сервера и остановки. Короткий интервал на большом мире означает частые короткие подвисания. BackupsPeriod на большом сервере ещё хуже: он упаковывает в zip всю папку сохранения каждые столько-то минут, а на мире размером в гигабайты это долгая тяжёлая работа прямо во время игры. Оставьте его на 0, держите BackupsOnStart=true и делайте настоящие резервные копии в тихий час вместе с перезапуском.

В RE:NODE вкладка Schedules умеет ровно это: консольная команда с предупреждением игрокам, задержка, /save, перезапуск, затем резервная копия - в час, когда никого нет. Сделанные так копии хранятся вне машины, чего нельзя сказать о собственных zip-архивах Zomboid. Как выбрать час, описано в статье расписания перезапусков, которые помогают.

Моды#

Моды - то место, где на сервере с модами прячутся проблемы производительности. Моды Zomboid написаны на Lua, и Lua-код, выполняющийся каждый тик, каждую минуту или при каждом действии игрока, складывается в длинном списке модов. Моды карт добавляют свои расходы: больше клеток с большим числом объектов, часто более детальных, чем в ванили.

Что помогает:

  • Удалите моды, которыми никто не пользуется. В длинном списке, собранном за несколько месяцев, обычно найдётся несколько таких.
  • Подозревайте всё, что работает по таймеру: системы погоды, спавнеры, фреймворки NPC, экономические моды, сканирующие контейнеры.
  • Делите пополам. Если сервер с модами лагает, а ванильный нет, уберите половину модов на копии сервера, протестируйте и повторите. Это медленно, но только этот метод даёт ответ.
  • Читайте консоль после обновлений. Мод, который раз за разом выбрасывает ошибки, медленнее работающего, а ошибки пролетают сотнями.

Порядок загрузки и мастерскую Steam разбирает статья моды на сервере Project Zomboid, а общую гигиену - как держать сервер с модами в чистоте.

Перезапуски#

Ежедневный или двухразовый в день перезапуск - нормальная практика для серверов Zomboid, и не без причины: расход памяти и накопленные объекты растут с аптаймом, а перезапуск возвращает сервер к чистому старту. Выберите час, когда онлайн меньше всего людей, заранее предупредите их в чате и сохраните мир перед остановкой. Перезапуск стоит минуту-две; сервер, который работает неделю и каждые несколько секунд собирает мусор, стоит вечера всем.

Решение проблем#

Сервер внезапно перезапускается, а в логе ничего нет. Он достиг лимита памяти тарифа. Снизьте -Xmx примерно до трёх четвертей тарифа, а если тогда куче будет мало места, перейдите на тариф выше.

Подёргивания каждые несколько минут, как по часам. Сохранение или zip-копии. Проверьте SaveWorldEveryMinutes и выставьте BackupsPeriod=0.

Зомби телепортируются вокруг одного игрока. Соединение или ПК этого игрока. Его клиент вычисляет движение зомби рядом с ним. Проверьте его пинг и частоту кадров.

Месяц сервер работал нормально, потом замедлился. Популяция на пике (PopulationPeakDay), накопились трупы и предметы или выросло сохранение. Проверьте каждое по очереди.

На одной базе лагает у всех, кто туда приходит. Трупы вокруг неё, переполненные контейнеры или очень сложная постройка. Уберите трупы и проверьте ItemNumbersLimitPerContainer.

Лаги начались после добавления мода. Уберите его на копии и протестируйте. Если это помогло, ищите альтернативу или настройку в моде, которая уменьшает его работу.

Игроков кикает за высокий пинг. Порог задаёт PingLimit в ini. Если его поднять, дальние игроки смогут оставаться, но зомби вокруг них всё равно будут лагать.

FAQ#

Сколько RAM нужно серверу Project Zomboid?

Три гигабайта для небольшой группы в одной области, 4-6 GB для восьми-шестнадцати разбредающихся игроков и 8-10 GB для большого сервера с модами. Ставьте -Xmx примерно в три четверти тарифа, никогда не весь объём.

Почему сервер лагает, когда мы расходимся?

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

Решит ли лаги Zomboid больше CPU?

Только если график CPU показывает, что сервер упёрся в свою долю. Многие жалобы на лаги в Zomboid связаны с памятью, накоплением или соединением одного игрока, и ничего из этого дополнительный CPU не меняет.

Стоит ли снизить популяцию зомби?

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

Трупы правда проблема для производительности?

На загруженных серверах - да. Каждый труп - объект в мире, который симулируется, пока загружен, и сохраняется вместе со своим чанком. Сотни трупов у базы складываются. Снижение HoursForCorpseRemoval - одно из самых эффективных доступных изменений.

Помогает ли PauseEmpty производительности?

Он останавливает мир, когда никого нет онлайн, - это экономит CPU в пустые часы и останавливает порчу вещей. Пока люди играют, он ничего не делает.


Комментарии

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

0/2000