Как выбрать подходящий объём 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

  1. Войдите в proxify.cloud → «Мои серверы» → выберите узел.
  2. Откройте вкладку «Ресурсы»«Память».
  3. Установите:
    • Memory (RAM): Target_Xmx_GB * 1.5 + 1 (в ГБ, округление вверх до 512 МБ).
    • Swap: 0 (для Java-процессов swap вреден; при нехватке — OOM Killer сработает быстрее и чище).
  4. Нажмите «Применить» → контейнер перезагрузится автоматически.

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" |