← На главную

LeanCore

Активный

Hytale • Version 1.8.0

серверпамятьramgovernorудержаниепроизводительностьадминобучениесолокооп

LeanCore это серверный governor памяти для Hytale. Он смотрит, сколько heap реально занято после каждой сборки мусора, и действует по этим данным: урезает дальность обзора и радиус симуляции, когда памяти действительно мало, тратит свободный heap на то, чтобы недавно посещённые чанки оставались загруженными (обратный путь не перечитывается с диска), и замедляет стриминг чанков при реальной нагрузке.

В локальном / соло мире LeanCore работает в профиле LITE. Когда заходят друзья, включается STANDARD. Выделенные серверы получают FULL.

Не трогает FPS, GPU и TPS клиента.

Требуется сервер Hytale >=0.7.0. После установки выполните /leancore status, когда сервер проработает около минуты.

LeanCore мод памяти сервера

Зачем он нужен

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

  • Оценивает память по сырому heap, в котором лежит мусор, ждущий следующей сборки. Сырой heap на здоровом сервере гуляет между 40% и 90%, поэтому всё, что на него реагирует, режет впустую.
  • Выбрасывает чанки даже при большом запасе heap. Вернитесь той же дорогой, и каждый чанк снова читается с диска.

LeanCore закрывает эти два пробела.

Замеры

Релиз Hytale 0.7.0, выделенный профиль (FULL), heap 6 GB. Четыре виртуальных исследователя уходят от спавна в разные стороны со скоростью 20 блоков/с и всё время генерируют новый ландшафт, пока сценарный игрок летит 600 блоков, ждёт 90с и возвращается. Сервер без модов против LeanCore 1.8.0, тот же мир и тот же маршрут.

без модаLeanCore 1.8.0
Тик мира, среднее19,6 мс13,4 мс (-32%)
Тик мира, p9544,8 мс35,1 мс (-22%)
Худший тик1440 мс299 мс (-79%)
Всего в паузах GC7,3 с5,0 с (-31%)
Самая длинная пауза GC1194 мс201 мс (-83%)
Heap после GC, p956071 MB4906 MB (-19%)
Пик heap после GC99,99% от максимума83% от максимума

Без LeanCore heap после GC дошёл до 99,99% от максимума, выше 85%, где движок начинает собственную аварийную выгрузку. С ним пик был 83%.

Цена: дальность обзора в среднем 16 чанков вместо 24 (минимум 12). Когда обзор возвращается на обратном пути, сброшенная зона загружается снова, поэтому на обратном пути с диска прочитано на 24% больше чанков, а тик был на 17% медленнее. Сам LeanCore занял 0,42% CPU сервера. По одному прогону на вариант; ваш мир будет другим.

Соло, удержание чанков

Пре-релиз Hytale 0.7: соло, heap 3 GB, тот же сценарный полёт, сборка до удержания чанков против 1.8.0.

до1.8.0
Чанков перечитано с диска на обратном пути1203653 (-46%)
Тик мира на обратном пути12,5 мс10,9 мс (-13%)
Дальность обзора при входеурезана до 8 ложной тревогой сырого heapосталась 10
Смен policy за прогон135

Цена: больше занятого heap во время прогона (не выше 50% после GC) и примерно на 0,16% больше времени в паузах GC. По одному прогону на сборку; ваш мир будет другим.

Как LeanCore решает

          каждые 5с в соло, каждый тик governor на серверах
                                   │
         heap после GC  +  old gen после GC  +  тренд роста
                                   │
        ┌──────────────┬───────────┴───────────┬──────────────┐
        ▼              ▼                       ▼              ▼
     COMFORT         WATCH                   TIGHT         CRITICAL
  полный обзор    мягкая урезка        сильнее урезка    макс. урезка
  держит лишние   отпускает            отпускает         отпускает
     чанки         чанки             + тормоз загрузки   + сильнее тормоз

Удержание чанков

   чанк выходит из обзора всех игроков
                 │
                 ▼
   движок выгрузил бы его через ~7,5с
                 │
   COMFORT и heap после GC ниже 45%?  ── нет ──►  движок выгружает
                 │ да
                 ▼
   LeanCore держит его (keep-loaded ссылка движка; тики останавливаются)
                 │
   игрок возвращается          ──►  уже загружен, без чтения с диска
   heap после GC выше 50%      ──►  сначала отпускаются дальние, 64 каждые 2с
   нагрузка или прошло 10 мин  ──►  отпущен, движок выгружает как обычно

Как думает LeanCore

1. Смотрит на heap, который реально остаётся

Сразу после каждой сборки мусора JVM сообщает, что выжило. Это число, плюс old gen после GC и его тренд, LeanCore и называет нагрузкой. Уровни по умолчанию:

УровеньHeap после GCЧто делает LeanCore
COMFORTниже 70%полный обзор, держит лишние чанки
WATCH70% и вышемягкая урезка обзора, отпускает удержанные чанки
TIGHT82% и вышесильнее урезка, меньше радиус симуляции, тормозит загрузку чанков
CRITICAL90% и вышемаксимальная урезка, сильнее тормоз, опциональный webhook

Сырой heap сам по себе считается CRITICAL только на 97%, когда память действительно кончается. Heap, который продолжает расти, может поднять уровень раньше, чем пересечёт порог.

2. Реагирует быстро и подтверждает перед действием

В соло проверка нагрузки идёт каждые 5 секунд и сразу будит governor, когда уровень растёт. Изменению нужны два замера для подтверждения, смены policy разнесены во времени, а если heap растёт сразу после возврата обзора, урезка возвращается.

3. Тратит свободный heap, а не теряет его

Когда чанк выходит из обзора всех игроков, движок выбрасывает его через несколько секунд, как бы ни выглядел heap. Пока уровень COMFORT и heap после GC ниже 45%, LeanCore держит бюджет таких чанков загруженными через собственную keep-loaded ссылку движка. Движок перестаёт их тикать, так что они стоят памяти, а не CPU. Вернулись, а они уже на месте. Если heap после GC поднимается выше 50%, сначала отпускаются дальние, по 64 каждые 2 секунды, чтобы короткий скачок не выбросил весь путь. Любой уровень нагрузки отпускает их все при следующей проверке, и LeanCore никогда не удаляет чанки сам.

4. Замедляет загрузку, только когда это нужно памяти

На TIGHT и CRITICAL скорость отправки чанков каждому игроку ограничивается (по умолчанию 512 и 192 секций в секунду). Этого хватает на ходьбу и полёт, но всплески при входе и телепорте не падают на заполненный heap. COMFORT и WATCH возвращают скорость самого движка.

5. Учитывает, кто играет

Онлайн-классификатор (Activity Sense) помечает каждого игрока по недавней активности: MINER LUMBERJACK FARMER BUILDER FIGHTER EXPLORER. Это питает модель спроса, которая решает, насколько урезать обзор каждого игрока в рамках общего бюджета.

6. Работает в правильном потоке

Любое чтение или запись chunk store, chunk tracker или дальности обзора выполняется в потоке мира-владельца. Фоновый планировщик только координирует.

С QuantumHy

LeanCore и QuantumHy работают по отдельности или вместе. Когда стоят оба, QuantumHy забирает дальность обзора клиента и скорость отправки чанков (своё сглаживание против фризов), а LeanCore оставляет себе память: уровни, радиус симуляции и удержание чанков. QuantumHy читает уровень LeanCore и сужает радиус рендера на TIGHT или CRITICAL. Тормоз чанков LeanCore выключен, пока загружен QuantumHy.

Профили runtime

LeanCore подстраивается под хост сам, по числу игроков, без ручного переключателя:

ПрофильКогдаТикЧто работает
LITEсоло встроенный мир30с (60с в простое), нагрузка каждые 5слёгкий governor, адаптивный обзор, удержание, обучение спроса
STANDARDнесколько друзей15сдобавляет Activity Sense, опциональные governor и обучение
FULLвыделенный сервер5сполный набор

Чего он намеренно не делает

  • Не трогает FPS, GPU и рендер клиента. Только heap сервера.
  • Не меняет TPS и поведение симуляции.
  • Не удаляет чанки. Выгрузка это работа движка; LeanCore только решает, сколько их держит свободный heap.
  • Не режет из-за мусора. Пики сырого heap между сборками игнорируются, пока heap действительно не подходит к пределу.

Возможности

  • Профили runtime: LITE соло, STANDARD друзья, FULL выделенный (localHostMode: AUTO)
  • Уровни по реальному heap: COMFORT, WATCH, TIGHT, CRITICAL по heap после GC, old gen после GC и тренду; откат, если возврат обзора навредил
  • Удержание чанков (1.8, chunkRetentionEnabled): свободный heap держит недавно покинутые чанки, и обратный путь не читает диск
  • Тормоз чанков (1.8, chunkRateBrakeEnabled): замедляет стриминг на TIGHT/CRITICAL; выключен, пока загружен QuantumHy
  • Урезка дальности обзора (LITE) и радиуса симуляции при реальной нагрузке, никогда ниже liteMinClientViewRadius
  • Activity Sense: онлайн softmax-классификатор (MINER, LUMBERJACK, FARMER, BUILDER, FIGHTER, EXPLORER) для спроса каждого игрока
  • Данные обучения: окна heap, модель спроса, статистика повторного посещения зон; сохраняются между перезапусками (schema v9)
  • Session savings: /leancore savings показывает пик/базу/дельту heap JVM и активность governor
  • Диагностика всегда включена (diagnosticLogEnabled): сводки при старте/остановке и логи решений [diag] прямо в логе сервера
  • Уведомления об обновлениях для операторов/админов при выходе нового JAR (отключить: checkForUpdates)
  • HUD админа (/leancore hud on): маленький оверлей heap/уровня. Выключен по умолчанию.
  • Heatmap, zone pin, опциональный webhook на CRITICAL

Установка

  1. Скачайте LeanCore-1.8.0.jar со вкладки Files на CurseForge
  2. Положите JAR в папку mods/ сервера (или %AppData%\Hytale\UserData\Mods\ в Windows)
  3. Запустите сервер. Конфиг создаётся в mods/durkz_LeanCore/LeanCore.json
  4. Выполните /leancore status примерно через минуту работы

Команды

Основная команда: /leancore

/leancore status
/leancore memory
/leancore savings
/leancore zones
/leancore learn
/leancore learn player
/leancore probe
/leancore hud on|off|status
/leancore heatmap [limit]
/leancore zone pin|unpin|pins

Команды админа, права и полный конфиг: документация

Конфиг

Файл: mods/durkz_LeanCore/LeanCore.json

Основные ключи: localHostMode, liteMemoryGovernorEnabled, liteViewRadiusEnabled, liteLearningEnabled, chunkRetentionEnabled, chunkRateBrakeEnabled, watchHeapRatio, tightHeapRatio, criticalHeapRatio, diagnosticLogEnabled, governEnabled, learningEnabled, embeddedStandardProfile, dedicatedServerMode.

Снапшот обучения: mods/durkz_LeanCore/learning.state.gz (schema v9, gzip).

Права

  • Кто видит HUD: группы в hudViewerGroups и/или durkz.leancore.hud
  • Heatmap, zone pin и диагностика webhook (админ): hudAdminGroups и/или durkz.leancore.admin

Рекомендуется

  • Соло / локально: localHostMode: AUTO (по умолчанию). LITE governor, удержание и обучение включены.
  • Выделенный или с друзьями: включите governEnabled и learningEnabled. Больше heap значит больше места для удержания.
  • С QuantumHy: ставьте оба; они сами делят работу.
  • В логе запуска должно быть profile=LITE в соло и LITE -> STANDARD, когда заходит друг.

Лицензия

MIT License

Для владельцев серверов

Нужны права, команды и конфиг?

Полное руководство описывает все права, админ-команды, примеры LuckPerms и параметры конфигурации.

Читать документацию сервера