
KAllFix - Мультипоточность и оптимизация сервера
KAllFix - технический мод для Minecraft, который раскидывает тики блоков, сущностей и измерений по потокам процессора и чинит ошибки популярных модов. Реальный способ поднять TPS сервера на тяжёлой сборке.
KAllFix - мод для Майнкрафт от разработчика n1luik, и это один из самых необычных оптимизаторов, что мне попадались. Если Canary или Lithium просто ускоряют ванильный код в рамках одного потока, то KAllFix идёт радикально дальше: он принудительно выносит тики блоков, тиковых блоков-сущностей (block entities), обычных сущностей и даже целых измерений в отдельные потоки процессора. А поскольку Minecraft изначально спроектирован как однопоточная игра и на сервере с 200+ модами грузит в лучшем случае пару ядер, профит на многоядерном железе получается очень ощутимым.
По духу проект напоминает ModernFix - такой же швейцарский нож, который чинит чужой код. Только здесь упор именно на серверную производительность. Вторая половина мода - огромный набор точечных фиксов под конкретные моды, от AE2 до Alex's Caves. Если собираете сервер на Forge 1.20.1 с тяжёлой сборкой модов (GregTech, Create, Cataclysm) - этот проект стоит изучить в первую очередь. Скачать KAllFix можно бесплатно, но приготовьтесь читать мануал: обычного конфиг-файла тут нет вообще, всё настраивается через JVM-параметры при запуске.
Что именно оптимизирует мод
Список впечатляет, и по нему видно, что автор реально профилирует сервера, а не гадает:
- Upgraded Additional Trims - общая оптимизация производительности.
- Atmospheric - убирает оверхед от проверки первоапрельской даты. Да, мод каждый тик проверял, не 1 апреля ли сегодня.
- Upgraded Core - оптимизация ядра библиотеки.
- [Let's Do] Farm & Charm - ускорение ИИ курятников, которые на больших фермах начинали жрать заметную часть тика.
- Event Wrapper.
- Create: FluidLogistics - параметр
-DKAF-fluidlogistics.DisabledDynamicUp=trueотключает обновление старых id, без этого возможны просадки. - AE2 - оптимизация игровых вычислений, на больших МЭ-сетях разница заметна.
- ItemStack.isSameItemSameTags - ускорение ванильного сравнения предметов, которое вызывается тысячи раз за тик.
- PPMO2 (Project MMO).
- Вырезает мёртвый код из Apotheosis и Create: Connected.
Исправленные баги и конфликты
Тут KAllFix вообще уникален. Автор латает конкретные проблемы конкретных модов:
- L_Ender's Cataclysm + MineColonies - фикс просадок производительности из-за подсчёта сущностей на сервере, где стоят оба мода.
- [Let's Do] Farm & Charm - останавливает спам невалидными пакетами.
- Biolith + ворлдген-моды на MCreator (например, Terramity) - решает конфликты генерации мира.
- Gregicality Rocketry + Canary - фикс совместимости, правда проблемы с хитбоксами на границах космических станций могут остаться.
- Petrolpark's Library 1.4.2 не запускалась на некоторых Java-средах - теперь запускается (фикс отключается через
-DKAF-DisablePetrolpark=false). - Alex's Caves - оптимизация и фикс просадок, связанных с магнитными полями.
- Create: Diesel Generators - чинит тормоза от миксинов.
- Старые версии Destroy - убирает краши сервера из-за ошибок подключения к базе данных.
Мультипоточность - главная фишка KAllFix
Теперь к самому интересному. Модуль k_multi_threading умеет распараллеливать:
- тики блоков (block ticks);
- тики block entities - это механизмы, печки, трубы, всё то, что обычно душит сервер в технических сборках;
- тики сущностей;
- тики измерений целиком;
- приём пакетов игрока (включается вручную, только клиент);
- логин игроков (включается вручную).
На сервере мультипоточность включена по умолчанию. На клиенте до версии 1.0.4.0 она не работала вовсе, а начиная с 1.0.4.0 включается параметром -DKMT_Client=true.
Важный нюанс, без которого лучше не запускать. Обязательно задайте -DKMT-threadMax=[количество потоков вашего CPU]. Если этого не сделать, генерация мира может просто зависнуть намертво. Если зависания продолжаются и после установки - повышайте значение выше числа физических потоков.
Ещё несколько практических моментов из опыта автора:
- Ошибки вида "thread-pool interception" или превышение лимитов в логах - норма, обычно сервер от них не падает. Не паникуйте, увидев красные строки.
- После версии 1.0.3.3 код
ParaServerChunkProvider,TaskRunи часть генерации чанков сильно завязаны на C2-компиляцию JVM. Проще говоря: не судите производительность по первым минутам после старта, машине нужно время прогреться. - На Windows Server 2022 Datacenter (среда самого автора) редко встречаются аномалии планировщика потоков с аномально высокой загрузкой CPU. Лечится банальным рестартом сервера.
Полный список JVM-параметров
Конфига в привычном понимании нет, так что этот раздел - фактически ваш config file. Сохраняю все параметры с пояснениями.
Базовые
-DKAllFix_D=[любые символы]- полностью отключает KAllFix.-DKMT_Client=true- включает мультипоточность на клиенте (с версии 1.0.4.0).-DKAF-DisablePetrolpark=false- отключает фикс для Petrolpark's Library 1.4.2.
Потоки и пул
-DKMT-threadMax=[число]- размер пула потоков. Ставить обязательно.-DKMT-callMax=[число]- максимум потоков, которые может задействовать одна мультипоточная задача.-DKMT-ThreadpoolKeepAliveTime=[миллисекунды]- время жизни простаивающих потоков до их очистки.-DKMT_D=[любые символы]- отключает мультипоточность.-DKMT-OpenVanillaServerChunkCache=true- принудительно включает ванильный путь фиксаServerChunkCache(добавлено в 1.0.5.3).
Соединение и таймауты
-DKAF-ClientboundKeepAlivePacket_Max=[миллисекунды]- меняет требования по времени для keep-alive пакетов (по умолчанию 15 секунд; в ванилле должно быть меньше 30, иначе игрока кикнет за таймаут).-DKAF-ServerTimeout=[секунды]- таймаут подключения к серверу. Может не сработать в отдельных случаях.-Dforge.readTimeout=[секунды]- таймаут чтения пакетов Forge. Используйте вместе с предыдущим:forge.readTimeoutпокрывает только чтение пакетов, а не сетевые потоки клиента и сервера.
Миксины, NBT, автокоманды
-DKAF-RemoveMixin:[имя класса]- отключает указанный миксин (работает и для миксинов изk_multi_threading). Полезно при диагностике конфликтов.-DKAF-NbtIoMixin_NotGZip=true- добавляет try-catch в NBT IO для файлов без gzip (небезопасно, требует commons-compress).-DKMT-ChunkGeneratorMode2Start=[true,false]- автоматически выполняет/SetterWorldConfig world setM2 %%KMT-ChunkGeneratorMode2Start%%.
Контроль размножения мобов
-DKAF-ChunkBreedingControlSize=[число]- запрещает размножение животных, если сущностей в чанке больше указанного. Без параметра (или если значение пустое/не число) функция выключена. Отличная защита от ферм на 500 коров в одном чанке.-DKAF-ChunkBreedingControlSizeEnable=[true,false]- кэш результатов проверки; ручная установка может быть перезаписана самим модом.
Опциональные функции
-DKMT-SafeUnloadChunk=true- выгрузка чанков в потоках генерации (рекомендуется только для версий ниже 1.0.4.2 при соответствующих зависаниях).-DIndependencePlayer=true- асинхронная обработка игроков (по словам автора, прироста почти не даёт).-DFixBiolithBugMode2=true- пытается пофиксить большинство проблем совместимости Biolith, но может привнести серьёзные баги.-DKAF-gtceu.MedicalConditionTrackerMixin=true- отключает радиацию в GTM.-DKAF-RemoveClientboundKeepAlivePacket=true- отключает ванильный keep-alive (пинг перестанет считаться).-DKAF-RemoveFlyingTest=true- убирает проверки полёта, чтобы античит ваниллы не кикал игроков.-DKAF-moonrise_fast_palette=true- отключает функциюfast_paletteиз Moonrise.-DKAF-FixTFMGDestroy=true- чинит совместимость Destroy и Create (помпа Creative Pump не подключалась к трубам Create).-DKAF-Fix_fabric-object-builder-api.jar=true- решает конфликтfabric-object-builder-apiиз Sinytra Connector с forge-47.3.27.-DKAF-FixAllPacket=true- фикс сетевых пакетов (включать и на клиенте, и на сервере); затрагивает Mekanism Explosives, Create, The Abyss II.-DKAF-ChunkAwareBlockCollisionSweeperFast=true- заменяетChunkAwareBlockCollisionSweeperиз Lithium аппроксимирующим алгоритмом.
Мультипоточный логин
-DKMT-LoginMultiThreading=true- включает многопоточный вход игроков. На серверах, где на старте заходит толпа, вещь полезная.-DKMT-LoginMultiThreading.ConnectionLock=true- ждёт завершения асинхронных задач в конце тика. Отключение чуть поднимет производительность, но снизит стабильность логина вплоть до крашей.-DKMT-LoginMultiThreading.TaskSizeMax=[число]- лимит одновременных задач логина (по умолчанию 8).- Учтите: из-за многопоточного логина сервер может получить
ServerboundMovePlayerPacketраньше времени, что вызовет одну ошибку в логе. Не страшно.
Оптимизация пакетов
-DKAF-packetOptimize=true- оптимизирует часть ванильных пакетов (включать строго на клиенте и сервере одновременно).-DKAF-packetOptimize.AttributesReOutputTime=[миллисекунды]- интервал принудительной повторной отправки атрибутов (по умолчанию 2 минуты).-DKAF-packetOptimize.CompatibilityMode.ClientboundBlockEntityDataPacket=true- более консервативное сжатие пакета, бьёт по производительности, но повышает совместимость.-DKAF-packetOptimize.CompatibilityMode.ClientboundSectionBlocksUpdatePacket=true- то же самое для пакета обновления блоков секции.
Прочее
-DKAF-UnsafeCinderscapesFix1=true- ограничивает прожорливую функциюenableAshFallв Cinderscapes.-DKAF-fix.asynchronous.ClientboundCustomQueryPacket=true- делает рукопожатие асинхронным, снижая шанс, что игрок не сможет зайти на сервер с гигантским списком модов.-DKAF-FixConfigAuto=true- автоматически меняет часть опций в конфигах других модов ради совместимости. Подробнее ниже, там есть подводные камни.
Установка
- Начиная с версии 1.0.3.18 мод работает сразу после помещения в папку mods (функция установки при этом сохранена).
- Для версий ниже сначала нужно запустить установщик командой:
java -jar k_multi_threading-xxx.jar -i [пусто или папка установки]. - Установка создаёт два файла:
k_multi_threading-base.jarиk_multi_threading-asm.jar. - Некоторые функции докачивают зависимости (
Zstd-jni 1.5.7-2). Если скачивание не удалось, положите их вручную впапка_игры/lib.
Совместимость: что нужно знать до запуска
Это самый важный раздел для живого сервера, не пропускайте.
Параметр -DKAF-FixConfigAuto=true автоматически отключает:
logOffthreadEntityAddв Cupboard;world.tick_schedulerиentity_by_typeв Canary / Lithium - но вы обязаны вручную добавитьmixin.world.tick_scheduler=falseвconfig/canary.propertiesилиconfig/lithium.properties, иначе эти моды перезапишут мультипоточный фикс дляClassInstanceMultiMap.
Случаи, когда -DKAF-FixConfigAuto=true лучше НЕ трогать:
- Возможен конфликт с
mixin.perf.cache_upgraded_structuresиз ModernFix - отключайте черезmixin.perf.cache_upgraded_structures=falseвconfig/modernfix-mixins.properties. - С включённым мультипоточным логином ParCool может начать нормально работать только после первой смерти игрока на сервере. Странно, но факт.
- Ars Creo изредка пишет в лог
Modifier is already applied on this attribute!- без краша, просто шум. - Ядерные реакторы деления из NuclearCraft: Neoteric в редких случаях неверно считают охлаждение после рестарта сервера.
И общая честная оговорка автора: Minecraft и большинство модов изначально спроектированы под один поток, поэтому стопроцентной гарантии, что не будет ни одной проблемы, дать нельзя. Мой совет - перед выкаткой на прод погоняйте сборку на тестовом сервере пару дней и сделайте бэкап мира. И да, с некоторыми комбинациями модов KAllFix придётся поставить и игрокам на клиент, даже если видимого эффекта там нет.
Команды
-
/debug_GetterClassFile [имя класса]- выгружает итоговые runtime-данные класса в папку игры с именем видавремя_save.class. Инструмент для разработчиков и тех, кто разбирается с конфликтом миксинов. -
/SetterWorldConfig [world, ClearErrorSize, RemoveRemoveErrorSize]- настройки этой команды не сохраняются между перезапусками.ClearErrorSize- очищает счётчик зафиксированных "ошибок с риском краша сервера".RemoveRemoveErrorSize- прекращает вести счётчик, но продолжает перехватывать ошибки.- Внутри
world [id измерения из реестра]доступны:setM2 [true,false]- переключает измерение на альтернативный режим реализации; приоритет выше, чем уsetMultiThreading, но может заморозить игру.setMultiThreading [число](по умолчанию0) - количество параллельных задач для конкретного измерения; независимый отsetM2режим, тоже способен заморозить игру.
Исходный код
Автор честно указывает заимствования: функция moonrise_fast_palette использует код Moonrise, а фиксы совместимости Gregicality Rocketry и Canary построены на исходниках Canary.
Стоит ли ставить
Если у вас клиент с парой модов ради косметики - проходите мимо, тут нечего ловить. Но если вы держите сервер на Forge 1.20.1 с тяжёлой сборкой, где GregTech соседствует с Create и Alex's Caves, а TPS проседает каждый вечер в прайм-тайм - KAllFix может дать то, чего не даст ни один другой оптимизатор: реальную утилизацию всех ядер процессора. Из коробки он не для новичков, без JVM-параметров и чтения мануала не взлетит, зато настроенный правильно вытягивает сервера, которым профилировщики вроде spark показывали красный MSPT по всем фронтам. Скачайте мод KAllFix, задайте -DKMT-threadMax под своё железо, прогрейте JVM - и смотрите, как растёт TPS.
Как поиграть с друзьями с модом KAllFix - Мультипоточность и оптимизация сервера?
Мод KAllFix - Мультипоточность и оптимизация сервера куда интереснее в компании: поднимите сервер Майнкрафт с уже установленным модом, позовите друзей и играйте по своим правилам. Хостинг Майнкрафт для мода KAllFix - Мультипоточность и оптимизация сервера будет готов за пару минут - BungeeHost сделает всё за вас.
