LeanCore
АктивныйHytale • Version 1.8.0
LeanCore это серверный governor памяти для Hytale. Он смотрит, сколько heap реально занято после каждой сборки мусора, и действует по этим данным: урезает дальность обзора и радиус симуляции, когда памяти действительно мало, тратит свободный heap на то, чтобы недавно посещённые чанки оставались загруженными (обратный путь не перечитывается с диска), и замедляет стриминг чанков при реальной нагрузке.
В локальном / соло мире LeanCore работает в профиле LITE. Когда заходят друзья, включается STANDARD. Выделенные серверы получают FULL.
Не трогает FPS, GPU и TPS клиента.
Требуется сервер Hytale >=0.7.0. После установки выполните /leancore status, когда сервер проработает около минуты.
Зачем он нужен
Движок и так выгружает любой чанк, который не видит ни один игрок, примерно через 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%) |
| Тик мира, p95 | 44,8 мс | 35,1 мс (-22%) |
| Худший тик | 1440 мс | 299 мс (-79%) |
| Всего в паузах GC | 7,3 с | 5,0 с (-31%) |
| Самая длинная пауза GC | 1194 мс | 201 мс (-83%) |
| Heap после GC, p95 | 6071 MB | 4906 MB (-19%) |
| Пик heap после GC | 99,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 | |
|---|---|---|
| Чанков перечитано с диска на обратном пути | 1203 | 653 (-46%) |
| Тик мира на обратном пути | 12,5 мс | 10,9 мс (-13%) |
| Дальность обзора при входе | урезана до 8 ложной тревогой сырого heap | осталась 10 |
| Смен policy за прогон | 13 | 5 |
Цена: больше занятого 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% | полный обзор, держит лишние чанки |
| WATCH | 70% и выше | мягкая урезка обзора, отпускает удержанные чанки |
| TIGHT | 82% и выше | сильнее урезка, меньше радиус симуляции, тормозит загрузку чанков |
| CRITICAL | 90% и выше | максимальная урезка, сильнее тормоз, опциональный 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
Установка
- Скачайте LeanCore-1.8.0.jar со вкладки Files на CurseForge
- Положите JAR в папку mods/ сервера (или
%AppData%\Hytale\UserData\Mods\в Windows) - Запустите сервер. Конфиг создаётся в mods/durkz_LeanCore/LeanCore.json
- Выполните
/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 и параметры конфигурации.
Читать документацию сервера