RE:NODE

Minecraft13 мин чтения

Folia для Minecraft: когда многопоточность окупается

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

0 прочтений

Folia - это форк Paper от PaperMC, в котором нет главного потока. Вместо того чтобы обрабатывать тик всего мира в одном цикле на одном ядре, она делит загруженные чанки на независимые регионы и тикает каждый регион в отдельном потоке, параллельно. Для сервера с сотнями игроков, разбросанных по огромной карте, на машине с большим числом настоящих ядер это единственный настоящий ответ на однопоточный потолок Minecraft. Почти для всех остальных - SMP, где люди живут в одном городе, скромный тариф на две-три vCPU, список плагинов с EssentialsX - она работает медленнее, сложнее в администрировании и несовместима с большей частью того, на что вы опираетесь. Дальше объясняется сам механизм, потому что, когда вы его увидите, решение в основном принимается само.

Что Folia меняет в тике#

Обычный сервер Minecraft, vanilla или Paper, выполняет один цикл тиков. Двадцать раз в секунду главный поток по порядку проходит по каждому загруженному миру, каждому тикающему чанку, каждой сущности, каждой блочной сущности, каждому запланированному обновлению редстоуна и каждой задаче плагинов. Если вся эта работа занимает больше 50 миллисекунд, тик опаздывает и TPS падает ниже 20. Paper выносит из этого потока много побочной работы - загрузку и генерацию чанков, освещение, часть сетевого кода, - но сама симуляция по-прежнему остаётся одной очередью на одном ядре. Поэтому серверу Minecraft гораздо важнее тактовая частота, чем число ядер, и поэтому статья CPU или RAM для игровых серверов раз за разом советует сначала смотреть на однопоточную производительность.

Folia разбирает эту очередь на части. Загруженные чанки, которые находятся рядом друг с другом, объединяются в независимый регион. У каждого региона свой цикл тиков, он работает на обычных 20 тиках в секунду и выполняется в пуле тик-потоков параллельно со всеми остальными регионами. Главного потока больше нет; каждый регион, по сути, - отдельный маленький сервер в общем процессе.

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

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

Пул тик-потоковпотоки из конфигаГлобальный регионвремя, погода, консольРегион A3 игрока, базаРегион B1 игрок исследуетРегион C40 игроков на спавне
Folia тикает регионы в разных потоках

На схеме виден весь подвох. Регион C, где сорок игроков стоят в одном месте, - это всё ещё один регион в одном потоке. Для толпы Folia ничего не делает. Она помогает, только когда нагрузка распределена по участкам, достаточно далёким друг от друга, чтобы оставаться отдельными регионами.

Для кого создана Folia, по словам самой PaperMC#

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

Отсюда честная проверка, прежде чем двигаться дальше:

ВопросFolia поможет, если...Оставайтесь на Paper, если...
Сколько игроков в пике?СотниМеньше 100 или около того
Где они находятся?Разбросаны по большому мируСобраны на спавне, в городе, на мини-игровых аренах
Сколько настоящих ядер?16 или большеНесколько vCPU
Какие плагины?Все заявляют поддержку FoliaЛюбой, который не заявляет
Кто обслуживает сервер?Тот, кто читает стектрейсы JavaНебольшая команда волонтёров

Если хотя бы в одной строке ваш ответ - «Оставайтесь на Paper», Folia почти наверняка не станет улучшением. Однопоточный потолок - реальное ограничение, но хорошо настроенный Paper упирается в него гораздо позже, чем думают, - обычно где-то после сотни активных игроков на быстром ядре и с разумной дальностью прорисовки. Оптимизация Paper и профиль spark обходятся дешевле смены платформы и решают ту проблему, которая на самом деле есть у большинства серверов.

Совместимость плагинов: стена, в которую упирается большинство#

Folia отказывается загружать плагин, который не заявил поддержку. Заявление - одна строка в plugin.yml плагина:

plugin.yml
name: ExamplePluginversion: 1.4.0main: com.example.ExamplePluginapi-version: '1.21'folia-supported: true

Эта строка - не формальность. Без главного потока у классического паттерна Bukkit «выполнить это в следующем тике» через BukkitScheduler просто нет потока, в котором его выполнять. Folia заменяет его четырьмя планировщиками:

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

В API Paper есть те же планировщики, поэтому плагин, написанный под них, может работать и на Paper, и на Folia из одного jar-файла. Плагин, написанный по-старому, не сможет работать на Folia без переписывания, потому что обращение к блоку или сущности не из того потока теперь ошибка, а не привычка.

Практические последствия для владельца сервера:

  1. Проверьте каждый плагин, прежде чем что-то планировать. Об этом скажет страница плагина или его plugin.yml. Если Folia не упоминается, считайте, что поддержки нет.
  2. Ждите пробелов как раз в тех категориях, которые важнее всего. Права (LuckPerms) и профилирование (spark) давно поддерживают Folia, предгенерация через Chunky работает. Большие плагины «всё в одном», большинство плагинов экономики и магазинов и значительная часть мини-игровых плагинов - нет, а EssentialsX, в частности, - плагин для Paper. Проверяйте текущее положение сами: поддержка меняется, а списки в интернете устаревают.
  3. Не дописывайте строку сами. Если добавить folia-supported: true в плагин, который не писали под Folia, он загрузится, а затем будет непредсказуемо ломаться, нередко повреждая то самое состояние, которое пытался изменить. Заявление - это обещание автора плагина, а не переключатель.

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

Установка Folia и её конфигурация#

PaperMC публикует сборки Folia рядом с Paper на своём сайте загрузок, и для новой версии Minecraft Folia обычно выходит через некоторое время после Paper. Прежде чем планировать вокруг неё обновление, убедитесь, что сборка для нужной версии существует.

Jar-файл запускается точно так же, как у Paper, с теми же требованиями к Java - Java 21 для текущих версий - и создаёт те же файлы конфигурации: server.properties, bukkit.yml, spigot.yml и папку config/ с paper-global.yml и paper-world-defaults.yml. Folia добавляет в paper-global.yml свой раздел для тик-потоков:

config/paper-global.yml
threaded-regions:  threads: -1chunk-system:  io-threads: -1  worker-threads: -1

threads: -1 позволяет Folia самой выбрать число тик-потоков по доступным ядрам. Настройки системы чанков те же, что в Paper, и определяют потоки для загрузки и генерации чанков. На машине с большим количеством ядер их можно задать явно, чтобы тик-потоки, обработчики чанков и сетевые потоки не боролись за одни и те же ядра; на маленьком выделении делить нечего - о чём и следующий раздел.

Три отличия в администрировании, о которых стоит знать до первого запуска:

  • Сгенерируйте мир заранее. Собственная рекомендация Folia - предгенерация, чтобы генерация чанков не конкурировала с тиками. На Folia это важнее, чем на Paper, потому что игроки-исследователи - это ровно та распределённая нагрузка, под которую она создана. Порядок действий с Chunky описан в статье граница мира и предгенерация.
  • TPS считается по регионам. У сервера на Folia нет одного TPS. Один регион может держать 20, а другой - 12, потому что сорок игроков построили в нём ферму мобов. Folia сообщает о состоянии регионов через собственные команды, и читать это приходится регион за регионом, а не по одной цифре.
  • Часть ванильного поведения отличается или отсутствует. Всё, что рассчитано на единый глобальный порядок тиков, - некоторые трюки со скорбордом, механизмы из редстоуна и командных блоков, пересекающие регионы, плагины, которые разом перебирают всех игроков онлайн, - может вести себя иначе. Тестируйте на копии.

Почему Folia плохо подходит для небольшого тарифа#

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

Вот честная арифметика. Допустим, ваш сервер на Paper тратит в пике 40 миллисекунд на тик. На Folia с двумя доступными ядрами в лучшем случае регионы поровну разделят нагрузку между двумя потоками - по 20 миллисекунд, - минус затраты на учёт регионов. В реалистичном случае большинство игроков находятся в одном-двух местах, один регион делает большую часть работы, и вы снова около 40 миллисекунд, только с дополнительными накладными расходами и меньшим выбором плагинов. При этом обработчики чанков и сборщик мусора конкурируют за те же два ядра, которые пытаются использовать тик-потоки.

В RE:NODE CPU жёстко ограничивается купленной долей: тариф Minecraft - от одного ядра на Starter до 3.5 vCPU на Premium, и лимит применяется к каждому контейнеру, а не занимается у соседей. Для Paper это вполне хорошее выделение: один быстрый поток ведёт симуляцию, а остальное поглощает работу с чанками и GC. До 16 физических ядер, под которые спроектирована Folia, ему очень далеко. Сервер на 100% CPU работает медленно, а не сломан, и за это никогда не приостанавливается - но на Folia вы упрётесь в эти 100% раньше, а не позже.

Даже целая выделенная машина требует размышлений. Линейка VDS здесь заканчивается шестью ядрами на i9-9900K - это быстрый процессор для Paper, но всё равно меньше ядер, чем рекомендует документация Folia. Если вы действительно на том масштабе, где Folia - ответ, вы и железо подбираете под неё.

Что делать вместо этого на любом масштабе#

Однопоточный потолок реален, но остаться под ним можно и дешевле, чем меняя серверную платформу.

До 50 игроков. Paper с разумными настройками. view-distance около 8 и simulation-distance около 6, лимиты сущностей под ваши фермы, предгенерированный мир и граница. В этом диапазоне почти всегда упираются в одну неправильно работающую вещь, а не в платформу. Обычные подозреваемые разобраны в статье почему падает TPS и что делать.

От 50 до 150 игроков. По-прежнему Paper, но с настройкой: дальность активации сущностей по мирам, настройки воронок и редстоуна и аккуратный список плагинов. Присмотритесь к Purpur или Pufferfish, если нужны их конкретные возможности, но выигрыш в основном даёт конфигурация, а не форк.

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

Сотни игроков в одном общем мире, и есть железо. Это и есть случай Folia. Но даже тогда закладывайте аудит плагинов, тестовый сервер и человека в команде, способного прочитать исключение о владении потоком.

code
You need Folia only if all of these are true:  - the world is shared and genuinely large  - players are spread across it, not gathered in one place  - you have well over 8 physical cores for this one server  - every plugin you need declares folia-supported: true  - Paper, tuned and profiled, has already hit its limit

Переход на Folia и обратно#

Если вы прошли все проверки выше, сам переход ничем драматичным не грозит. Folia использует формат мира и структуру папок Paper - world, world_nether и world_the_end на верхнем уровне, - так что мир Paper загружается на Folia без конвертации, а мир Folia - обратно на Paper.

  1. Снимите бэкап вне машины и убедитесь, что можете его восстановить. Почему копия в той же папке не считается, объясняет статья бэкапы, которые действительно восстанавливаются.
  2. Удалите из `plugins/` все плагины без поддержки Folia, а их папки с данными сохраните в надёжном месте, чтобы можно было к ним вернуться.
  3. Замените jar-файл соответствующей сборкой Folia, сохранив ту же версию Minecraft.
  4. Запустите сервер, когда никого нет онлайн, и прочитайте лог с самого начала. Каждый плагин, который Folia отказалась загружать, там назван.
  5. Проверьте то, что пересекает регионы: телепортацию, порталы, межмировые команды, всё, что рассылается всем игрокам, и любые плагины экономики и приватов, которым нужно обращаться к блокам далеко от того, кто выполняет команду.
  6. Проведите нагрузочный тест с живыми игроками до объявления. Синтетическая нагрузка редко распределяется так, как распределяются реальные игроки.

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

В RE:NODE линейка Minecraft поставляется с Paper и уже подобранной версией Java. Folia вам пришлось бы загрузить самостоятельно через файловый менеджер или SFTP и указать на неё во вкладке Startup: белого списка разрешённых jar-файлов нет, но нет и переключения в один клик. Слоты для бэкапов есть на каждом тарифе, их можно заблокировать от ротации на время тестов и восстановить кнопкой, если эксперимент не удастся.

FAQ#

Folia быстрее Paper?

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

Можно ли запускать на Folia обычные плагины Paper?

Нет, если автор не добавил поддержку Folia и не указал folia-supported: true в plugin.yml. Всё остальное Folia загружать отказывается. Плагины, написанные на планировщиках регионов и сущностей Paper, могут работать на обеих платформах из одного jar-файла; плагины, построенные на старом планировщике Bukkit, - нет.

Поможет ли Folia серверу на 20 игроков?

Нет. Двадцать игроков вполне по силам одному быстрому потоку на Paper, если сервер разумно настроен. Если сервер на 20 игроков лагает, тик съедает что-то конкретное, и профайлер найдёт это быстрее, чем смена платформы.

Переживёт ли мой мир переход на Folia?

Да. Folia использует тот же формат мира и ту же структуру папок в стиле Bukkit, что и Paper, поэтому мир загружается в обе стороны. Меняется набор плагинов, которые могут работать, так что бэкапьте папки с данными плагинов вместе с миром.

Достаточно ли Folia стабильна для продакшена?

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


Комментарии

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

0/2000