Флаги Aikar меняются при 12 ГБ — пять из них, и один уменьшается
Копирование набора флагов для 4 ГБ на сервер с 16 ГБ приводит к пяти неверным значениям. Вот какие именно пять, а также количество игроков, при котором моддифицированный сервер пересекает черту, а ванильный — нет.
Флаги Aikar — это стандартные в сообществе аргументы JVM для сервера Paper, и обычно их копируют одним блоком. Но это не один блок: из двадцати аргументов пять меняются в зависимости от того, превышает ли размер вашей кучи 12 ГБ. Вставка набора для малой кучи на сервер с большой кучей — это самый распространенный способ запустить "рекомендуемые флаги" и не получить их.
Пять изменяющихся флагов
| флаг | до 12 ГБ | 12 ГБ и более |
|---|---|---|
-XX:G1NewSizePercent | 30 | 40 |
-XX:G1MaxNewSizePercent | 40 | 50 |
-XX:G1HeapRegionSize | 8M | 16M |
-XX:G1ReservePercent | 20 | 15 |
-XX:InitiatingHeapOccupancyPercent | 15 | 20 |
G1ReservePercent — это тот, который уменьшается. Четыре из пяти увеличиваются с размером кучи, а этот уменьшается, поэтому полузабытое "увеличить числа для большого сервера" приводит к неправильному набору, а не просто к неоптимальному. Он резервирует часть кучи на случай сбоя эвакуации, и большая куча нуждается в меньшей доле, чтобы обеспечить тот же абсолютный запас.
Остальные тринадцать аргументов -XX: идентичны при любом размере кучи — -XX:+UseG1GC, -XX:MaxGCPauseMillis=200, -XX:+AlwaysPreTouch, -XX:SurvivorRatio=32, -XX:MaxTenuringThreshold=1 и остальные не меняются. Только -Xms и -Xmx отслеживают сам размер кучи.
Где на самом деле проходит граница 12 ГБ
Генератор на этой странице определяет размер кучи по количеству Игроков:
GB = clamp( ceil( (modded ? 2.5 : 1) × (2 + players / 12) ), 2, 32 )
Моддифицированные серверы рассчитываются как в 2,5 раза больше ванильных, и этот фактор решает, кто вообще увидит ветку для большой кучи:
| Игроки | ванильный | моддифицированный |
|---|---|---|
| 10 | 3 ГБ | 8 ГБ |
| 20 | 4 ГБ | 10 ГБ |
| 29 | 5 ГБ | 12 ГБ ← моддифицированный пересекает здесь |
| 50 | 7 ГБ | 16 ГБ |
| 100 | 11 ГБ | 26 ГБ |
| 109 | 12 ГБ ← ванильный пересекает здесь | 28 ГБ |
Моддифицированный сервер достигает флагов для большой кучи при 29 Игроках. Ванильный — только при 109. Таким образом, для большинства людей, использующих ванильный Paper, набор для малой кучи является правильным постоянно — а для большинства людей, использующих моддифицированный, он перестает быть правильным гораздо раньше, чем они ожидают.
Два важных ограничения в этой формуле
Она никогда не рекомендует более 32 ГБ. Ванильный сервер достигает предела при 349 Игроках и остается там. Это не артефакт округления — после примерно 32 ГБ JVM теряет сжатые указатели на объекты, и каждая ссылка в куче становится больше, поэтому больше ОЗУ может означать меньше полезной кучи. Масштабирование за эту точку — задача для второго сервера, а не для большего.
Она никогда не рекомендует менее 2 ГБ, даже для одного Игрока, потому что нижний предел — это серверное программное обеспечение, а не количество населения.
И что бы ни говорила формула: не отдавайте JVM всю память, что есть на машине. -Xms и -Xmx здесь намеренно установлены на одно и то же значение — фиксированная куча предотвращает изменение размера JVM под нагрузкой — что означает, что выбранное вами число запрашивается немедленно и постоянно. Оставьте операционной системе 1–2 ГБ, за которые ей не придется с вами бороться.