Как увеличить объём оперативной памяти серверу

1. Оценка текущих ресурсов и планирование

Перед изменением конфигурации определите, сколько памяти физически доступно на выделенном сервере и сколько уже используется.

  1. Подключитесь к серверу по SSH:
    ssh root@<IP-адрес_сервера>
    
  2. Проверьте общее количество ОЗУ и доступное:
    free -h
    
    Пример вывода:
                total        used        free      shared  buff/cache   available
    Mem:           62Gi       4.5Gi        52Gi       1.2Gi       5.8Gi        55Gi
    Swap:          4.0Gi          0B       4.0Gi
    
  3. Определите, какой объём можно выделить Minecraft. Рекомендуется оставлять 2–4 ГБ под систему и буферы. Если на сервере 64 ГБ, безопасно выделить 58–60 ГБ под Java-процесс.

2. Остановка игрового сервера

Никогда не меняйте параметры запуска на работающем сервере — это приведёт к потере данных или критическому лагу.

  1. Если сервер запущен через systemd (стандарт для proxify.cloud):
    systemctl stop minecraft
    
    Имя юнита может отличаться: mc-server, paper, fabric. Уточните командой systemctl list-units | grep -i mine.
  2. Если сервер запущен в screen или tmux вручную:
    screen -S mc -X stuff "stop$(printf '\r')"
    
    Подождите 10–15 секунд до полной остановки процесса.

3. Редактирование параметров запуска (systemd)

На выделенных серверах proxify.cloud чаще всего используется systemd для автозапуска и управления памятью.

  1. Откройте юнит-файл:
    systemctl edit --full minecraft
    
    Замените minecraft на реальное имя сервиса.
  2. Найдите секцию [Service] и директиву ExecStart. Она выглядит примерно так:
    ExecStart=/usr/bin/java -Xms4G -Xmx4G -jar /opt/minecraft/server.jar nogui
    
  3. Измените флаги -Xms (начальная куча) и -Xmx (максимальная куча) на нужные значения. Например, для 32 ГБ:
    ExecStart=/usr/bin/java -Xms32G -Xmx32G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -jar /opt/minecraft/server.jar nogui
    
    Важно:
    • -Xms и -Xmx должны быть равны (фиксированная куча) — это снижает фрагментацию и паузы GC.
    • Используйте суффиксы G или M (гигабайты/мегабайты).
    • Флаги G1GC выше — рекомендуемые настройки для Paper/Spigot/Purpur на больших кучах (>12 ГБ).
  4. Сохраните файл (в редакторе nano: Ctrl+O, Enter, Ctrl+X).
  5. Перезагрузите конфигурацию systemd:
    systemctl daemon-reload
    

4. Редактирование скрипта запуска (ручной запуск / panel-скрипты)

Если на сервере используется кастомный скрипт запуска (например, start.sh) или панель управления (Pterodactyl, PufferPanel), правьте его.

  1. Найдите скрипт. Типичные пути:
    • /opt/minecraft/start.sh
    • /home/minecraft/start.sh
    • /var/lib/pterodactyl/volumes/<uuid>/start.sh (если стоит Pterodactyl на proxify.cloud)
  2. Откройте для редактирования:
    nano /opt/minecraft/start.sh
    
  3. Найдите строку с java -Xms... -Xmx... и замените значения:
    #!/bin/bash
    JAVA_ARGS="-Xms32G -Xmx32G -XX:+UseG1GC ... (остальные флаги) ..."
    java $JAVA_ARGS -jar paper-1.20.4.jar nogui
    
  4. Сделайте скрипт исполняемым (на случай сброса прав):
    chmod +x /opt/minecraft/start.sh
    chown minecraft:minecraft /opt/minecraft/start.sh
    

5. Настройка JVM для больших куч (Transparent Huge Pages и Swap)

На Ubuntu в proxify.cloud по умолчанию могут быть включены Transparent Huge Pages (THP), что вызывает задержки при аллокации памяти >16 ГБ.

  1. Проверьте статус THP:
    cat /sys/kernel/mm/transparent_hugepage/enabled
    
    Вывод [always] madvise never означает, что THP включен.
  2. Отключите THP навсегда через systemd-tmpfiles или grub. Самый надёжный способ — через grub:
    nano /etc/default/grub
    
    Добавьте transparent_hugepage=never в GRUB_CMDLINE_LINUX_DEFAULT:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet transparent_hugepage=never"
    
  3. Обновите grub и перезагрузите сервер (планируйте ребут в окне обслуживания):
    update-grub
    reboot
    
    Если ребут невозможен прямо сейчас, отключите временно до ребута:
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    
  4. Настройте vm.swappiness для минимизации свопирования Java-кучи:
    echo 'vm.swappiness=1' >> /etc/sysctl.d/99-minecraft.conf
    sysctl --system
    

6. Проверка лимитов пользователя (ulimits)

Процесс Java не сможет зааллоцировать память, если стоит жесткий лимит memlock или as.

  1. Проверьте текущие лимиты для пользователя minecraft:
    su - minecraft -c "ulimit -a"
    
  2. Если max memory size или virtual memory не unlimited, отредактируйте /etc/security/limits.conf:
    nano /etc/security/limits.conf
    
    Добавьте в конец:
    minecraft soft memlock unlimited
    minecraft hard memlock unlimited
    minecraft soft nofile 1048576
    minecraft hard nofile 1048576
    
  3. Убедитесь, что PAM загружает лимиты. В /etc/pam.d/common-session и /etc/pam.d/common-session-noninteractive должна быть строка:
    session required pam_limits.so
    

7. Запуск сервера и верификация

  1. Запустите сервер:
    systemctl start minecraft
    # или
    systemctl start mc-server
    
  2. Следите за логами в реальном времени:
    journalctl -u minecraft -f
    # или для ручного запуска
    tail -f /opt/minecraft/logs/latest.log
    
  3. После загрузки мира (в логе появится Done (X.Xs)! For help, type "help") проверьте реальное потребление памяти:
    ps aux | grep java | grep -v grep
    
    Обратите внимание на столбец RSS (Resident Set Size) — он должен соответствовать вашему -Xmx (с небольшим оверхедом 1-2 ГБ на Metaspace, Code Cache, Direct Memory).
  4. Зайдите в игру и выполните команду /gc (есть в Paper/Purpur) или посмотрите Timings (/timings on, /timings paste). Убедитесь, что GC паузы не превышают 50-100 мс.

8. Корректировка конфигураций сервера под новую память

Увеличение кучи требует пересмотра настроек в paper.yml, spigot.yml, bukkit.yml, иначе вы не получите прироста производительности.

paper.yml (ключевые параметры):

# Увеличьте лимит сущностей для обработки за тик, если их много
max-auto-save-chunks-per-tick: 24
# Оптимизация чанков
chunk-loading:
  enabled: true
# Настройки сохранения
save-user-cache-on-stop-only: true
# Mob spawning — увеличьте лимиты, если фермы ломаются
spawner:
  spawn-limits:
    ambient: 15
    axolotls: 5
    creature: 25
    monster: 70
    underground_water_creature: 5
    water_ambient: 20
    water_creature: 10

bukkit.yml:

spawn-limits:
  monsters: 70
  animals: 15
  water-animals: 5
  water-ambient: 20
  axolotls: 5
chunk-gc:
  period-in-ticks: 400

spigot.yml:

save-user-cache-on-stop-only: true
entity-activation-range:
  animals: 32
  monsters: 32
  raiders: 48
  misc: 16
  water: 8
  villagers: 16
  flying-monsters: 48
tick-inactive-villagers: false
nerf-spawner-mobs: true

Примените изменения: /reload в игре или перезапуск сервера.

9. Мониторинг в панели proxify.cloud

После изменений зайдите в панель управления proxify.cloud (Proxmox VE).

  1. Выберите ваш выделенный сервер (Node) в дереве слева.
  2. Перейдите во вкладку Summary (Сводка).
  3. Наблюдайте за графиком Memory Usage (RAM).
    • Линия Used должна стабилизироваться на уровне -Xmx + ~2 ГБ системные нужды.
    • Не должно быть роста Swap Used. Если своп растёт — уменьшите -Xmx или добавьте ОЗУ.
  4. При необходимости настройте алерты: Datacenter -> Notifications -> Add -> Metric: memory, Threshold: 90%.

Возможные проблемы и решения

1. Сервер не запускается: "Could not reserve enough space for object heap"

Причина: Запрошено больше памяти,