Как выбрать подходящий объём RAM для сервера
Введение: почему расчёт памяти критичен на proxify.cloud
На выделенном сервере с Ubuntu в панели proxify.cloud (Proxmox VE) вы платите за физическое железо. В отличие от VPS, где лимиты виртуальны, здесь ошибка в расчёте RAM приводит к OOM Killer, лагам или простоям. Ниже — пошаговый алгоритм подбора объёма под конкретную сборку, версию ядра и онлайн.
1. Соберите базовую телеметрию текущего состояния
Перед изменением тарифа или добавлением модулей DIMM зафиксируйте метрики за 24–48 часов пиковой нагрузки.
1.1. Подключитесь к контейнеру/VM через SSH
ssh root@<IP_ВАШЕГО_СЕРВЕРА_PROXIFY>
В панели proxify.cloud IP виден в разделе «Сеть» → «IPv4 адреса» выбранного CT/VM.
1.2. Установите инструменты мониторинга (если отсутствуют)
apt update && apt install -y htop iotop sysstat jq
1.3. Запустите сбор статистики Java-процесса
Создайте скрипт логирования каждые 60 секунд:
cat > /opt/mc_ram_monitor.sh << 'EOF'
#!/bin/bash
PID=$(pgrep -f "paper|purpur|fabric|forge|velocity|bungeecord" | head -n1)
[ -z "$PID" ] && exit 1
while true; do
RSS_KB=$(awk '/VmRSS/ {print $2}' /proc/$PID/status 2>/dev/null)
HEAP_USED=$(jcmd $PID GC.heap_info 2>/dev/null | awk '/used/ {print $3}' | head -n1)
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP RSS=${RSS_KB}KB HEAP_USED=${HEAP_USED}B" >> /var/log/mc_ram_usage.log
sleep 60
done
EOF
chmod +x /opt/mc_ram_monitor.sh
nohup /opt/mc_ram_monitor.sh >/dev/null 2>&1 &
1.4. Снимите показатели после нагрузочного теста
Проведите ивент/рейд/пик онлайна 30–60 минут. Затем:
kill $(pgrep -f mc_ram_monitor.sh)
tail -n 100 /var/log/mc_ram_usage.log
Запишите максимальный RSS (Resident Set Size) и пиковый HEAP_USED.
2. Определите тип сборки и её коэффициенты накладных расходов
| Тип сервера | Базовый Heap (Xms/Xmx) | Off-heap overhead (Metaspace, CodeCache, Direct buffers, Netty, GC structures) | Коэффициент запаса |
|---|---|---|---|
| Paper / Purpur (1.16–1.20.4) | 2–4 ГБ на 50 игроков | +35–50% от Xmx | 1.5x |
| Fabric (Lithium, Starlight, modern fix mods) | 1.5–3 ГБ на 50 игроков | +25–35% от Xmx | 1.4x |
| Forge / NeoForge (тяжелые модпаки 300+ модов) | 6–10 ГБ на 20 игроков | +50–80% от Xmx | 1.6x |
| Velocity / BungeeCord (прокси) | 512 МБ – 1 ГБ | +20% | 1.3x |
Правило для proxify.cloud: физическая RAM контейнера =
Xmx * коэффициент + 512 МБ(на ОС и systemd).
3. Рассчитайте целевой Xmx по формуле
3.1. Формула для игровых нод (Paper/Fabric/Forge)
Target_Xmx_GB = (Peak_RSS_GB / Safety_Coeff) * 1.15
где Safety_Coeff — коэффициент из таблицы выше, 1.15 — запас на рост чанков/энтити.
3.2. Пример расчёта (Paper 1.20.4, пик 60 игроков)
- Замеренный
Peak_RSS = 5.8 ГБ - Коэффициент Paper = 1.5
Target_Xmx = (5.8 / 1.5) * 1.15 ≈ 4.45 ГБ→ округляем до 5 ГБ (кратно 512 МБ).
3.3. Пример для модпака Forge 1.19.2 (300 модов, 25 игроков)
Peak_RSS = 14.2 ГБ- Коэффициент Forge = 1.6
Target_Xmx = (14.2 / 1.6) * 1.15 ≈ 10.2 ГБ→ 10.5 ГБ.
4. Настройте JVM-флаги в стартовом скрипте
Откройте файл запуска (обычно /home/minecraft/start.sh или /opt/minecraft/start.sh):
nano /home/minecraft/start.sh
4.1. Универсальный шаблон для Paper/Purpur (Java 21, G1GC)
#!/bin/bash
XMX="5G"
XMS="5G"
JAVA_OPTS="
-Xms${XMS} -Xmx${XMX}
-XX:+UseG1GC
-XX:+ParallelRefProcEnabled
-XX:MaxGCPauseMillis=100
-XX:+UnlockExperimentalVMOptions
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:G1HeapRegionSize=16M
-XX:G1NewSizePercent=30
-XX:G1MaxNewSizePercent=40
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=4
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1MixedGCLiveThresholdPercent=90
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:SurvivorRatio=32
-XX:+PerfDisableSharedMem
-XX:MaxTenuringThreshold=1
-Dusing.aikars.flags=https://mcflags.emc.gs
-Daikars.new.flags=true
-Dterminal.jline=false
-Dterminal.ansi=true
"
exec java $JAVA_OPTS -jar paper-1.20.4.jar --nogui
4.2. Для Forge/NeoForge (Java 17/21, Shenandoah при ≥12 ГБ heap)
XMX="10G"
XMS="10G"
JAVA_OPTS="
-Xms${XMS} -Xmx${XMX}
-XX:+UseShenandoahGC
-XX:ShenandoahGCHeuristics=compact
-XX:MaxGCPauseMillis=100
-XX:+AlwaysPreTouch
-XX:+ParallelRefProcEnabled
-XX:+UnlockExperimentalVMOptions
-XX:+DisableExplicitGC
"
Shenandoah доступен в OpenJDK 17+ (в Ubuntu 22.04/24.04 — пакет openjdk-21-jdk-headless).
4.3. Для Velocity (прокси)
XMX="1G"
XMS="1G"
JAVA_OPTS="-Xms${XMS} -Xmx${XMX} -XX:+UseG1GC -XX:MaxGCPauseMillis=50"
5. Примените лимит в панели proxify.cloud (Proxmox)
RAM контейнера (CT) или VM должна быть строго больше настроенного Xmx + overhead.
5.1. Через веб-интерфейс proxify.cloud
- Войдите в proxify.cloud → «Мои серверы» → выберите узел.
- Откройте вкладку «Ресурсы» → «Память».
- Установите:
- Memory (RAM):
Target_Xmx_GB * 1.5 + 1(в ГБ, округление вверх до 512 МБ). - Swap: 0 (для Java-процессов swap вреден; при нехватке — OOM Killer сработает быстрее и чище).
- Memory (RAM):
- Нажмите «Применить» → контейнер перезагрузится автоматически.
5.2. Через CLI (qm/pct) — если доступен root на гипервизоре
# Для LXC контейнера (CTID=100)
pct set 100 -memory 8192 -swap 0
# Для VM (VMID=200)
qm set 200 -memory 8192
Значения в МБ. После изменения VM требует полной перезагрузки (cold reboot).
6. Валидация: нагрузочный тест после изменения
6.1. Запустите сервер и дождитесь полной загрузки чанков
systemctl restart minecraft # если используете systemd unit
# или
cd /home/minecraft && ./start.sh
6.2. Проверьте GC-логи (включите их в JAVA_OPTS при необходимости)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xlog:gc*:/var/log/minecraft/gc.log:time,uptime,level,tags
6.3. Симулируйте онлайн с помощью mc-monitor или плагина Spark
# Установка Spark в игру через консоль
/plugman load Spark
/spark profiler --timeout 300
Анализируйте отчёт: Heap usage не должен превышать 85% от Xmx в пике.
6.4. Контроль RSS на хосте
watch -n 5 "ps -o pid,rss,cmd -p $(pgrep -f paper)"
RSS должен стабилизироваться в диапазоне Xmx * 1.3 … Xmx * 1.5.
7. Автоматизация пересчёта при росте онлайна
Создайте cron-задачу, которая раз в неделю корректирует Xmx на основе новых логов:
cat > /opt/ram_autotune.sh << 'EOF'
#!/bin/bash
LOG="/var/log/mc_ram_usage.log"
[ ! -f "$LOG" ] && exit 0
MAX_RSS_KB=$(awk '{for(i=1;i<=NF;i++) if($i~/^RSS=/) {gsub("RSS=","",$i); gsub("KB","",$i); print $i}}' "$LOG" | sort -nr | head -1)
MAX_RSS_GB=$(echo "scale=2; $MAX_RSS_KB/1024/1024" | bc)
# Коэффициент для Paper
NEW_XMX=$(echo "scale=0; ($MAX_RSS_GB/1.5)*1.15/0.5" |
Комментарии (0)