Как уменьшить нагрузку на процессор

1. Анализ текущей нагрузки и сбор базовых метрик

Перед внесением изменений зафиксируйте текущее состояние. В панели proxify.cloud (Proxmox VE) перейдите в узел (Node) → Summary. Запишите средние значения CPU Usage за последние 24 часа и пиковые значения.

На самом сервере (через SSH) выполните:

# Установка утилит мониторинга
apt update && apt install -y htop iotop sysstat jq

# Запуск сбора статистики в фоне (соберет данные за 5 минут)
sar -u 1 300 -o /tmp/cpu_load.sar &

Подключитесь к консоли сервера Minecraft (screen/tmux) и введите команду для профиля:

# В консоли сервера (Paper/Purpur)
timings on
# Подождите 3-5 минут при онлайне
timings paste

Ссылка на отчет Timings покажет, какие плагины/таски потребляют больше всего тиков (ms/tick). Сохраните ссылку.

2. Оптимизация JVM-флагов (файл запуска)

На выделенном сервере с Ubuntu файл запуска обычно лежит в /home/minecraft/start.sh или /opt/minecraft/start.sh. Откройте его:

nano /home/minecraft/start.sh

Замените стандартные флаги на оптимизированные для Paper/Purpur (Java 21, G1GC/ZGC). Пример для 32 ГБ RAM (выделите 70-80% под кучу, остальное — Metaspace, CodeCache, OS):

#!/bin/bash
JAVA_EXEC="/usr/bin/java"
JAR_FILE="paper-1.21.1.jar"
RAM_TOTAL_GB=32
HEAP_GB=$((RAM_TOTAL_GB * 75 / 100)) # 24G

# Флаги для Java 21 (ZGC — лучший выбор для низкой задержки на больших кучах)
JVM_FLAGS="
-Xms${HEAP_GB}G -Xmx${HEAP_GB}G
-Z:+ZGenerational
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC
-XX:SoftMaxHeapSize=${HEAP_GB}G
-XX:MaxRAMPercentage=75
-XX:InitialRAMPercentage=75
-XX:+AlwaysPreTouch
-XX:+DisableExplicitGC
-XX:+ParallelRefProcEnabled
-XX:+PerfDisableSharedMem
-XX:MaxInlineLevel=18
-XX:MaxTrivialSize=12
-Dterminal.jline=false
-Dterminal.ansi=true
-Dfile.encoding=UTF-8
-Dsun.stdout.encoding=UTF-8
-Dsun.stderr.encoding=UTF-8
"

$JAVA_EXEC $JVM_FLAGS -jar $JAR_FILE --nogui

Важно: Если RAM < 16 ГБ, используйте G1GC вместо ZGC:

-XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapWastePercent=5 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=50

Сделайте файл исполняемым и перезапустите сервер:

chmod +x /home/minecraft/start.sh
systemctl restart minecraft  # если используется systemd
# или через screen вручную

В панели proxify.cloud проверьте график CPU после рестарта — пики GC (Garbage Collection) должны стать ровнее.

3. Настройка paper-global.yml — глобальные тормоза

Файл: /home/minecraft/paper-global.yml (создается при первом запуске Paper/Purpur). Откройте и примените следующие значения (только измененные параметры):

# /home/minecraft/paper-global.yml
settings:
  # Отключаем обработку пустых чанков при сохранении
  save-empty-scoreboard-teams: false
  # Уменьшаем частоту сохранения данных игроков (раз в 30 мин вместо дефолтных)
  player-auto-save-rate: 3600
  # Оптимизация поиска путей (критично для мобофармов)
  pathfinding-max-dist: 24
  # Отключаем лишние проверки коллизий
  use-faster-eigencraft-redstone: true
  # Обновление сенсоров мобов реже
  mob-spawner-tick-rate: 2
  # Лимит сущностей в чанке (жесткий кап)
  entity-per-chunk-save-limit:
    experience_orb: 16
    item: 32
  # Отключаем телеметрию Moang (не влияет на геймплей)
  moang-bugfix: true
  # Исправление дуп-багов без нагрузки
  fix-items-merging-through-walls: true

Перезапуск не обязателен, достаточно /paper reload в консоли, но лучше полный рестарт.

4. Настройка paper-world.yml — настройки мира

Файл: /home/minecraft/worlds/world/paper-world.yml (для каждого мира). Ключевые параметры для CPU:

# /home/minecraft/worlds/world/paper-world.yml
settings:
  # Частота спавна мобов (тиков). 1 = каждый тик (дефолт), 2 = раз в 2 тика. Ставьте 2-4.
  mob-spawn-tick-rate: 2
  # Деспавн мобов дальше 128 блоков (дефолт), уменьшаем до 96 для экономии тиков на AI
  despawn-ranges:
    soft: 80
    hard: 96
  # Оптимизация хопперов (главные пожиратели CPU в технических серверах)
  hopper:
    disable-move-event: true  # Отключает событие InventoryMoveItemEvent для хопперов
    ignore-occluding-blocks: true # Хопперы не проверяют блоки сверху
    cooldown-when-full: true    # Пауза если инвентарь полон
  # Контейнеры: отключаем обновление клиентов при закрытии
  container-update-tick-rate: 4
  # Дроп предметов: объединяем быстрее
  item-despawn-rate: 300 # 5 минут вместо 5 минут (дефолт 6000 тиков = 5 мин, тут в тиках? нет, в тиках дефолт 6000. Ставим 3000 = 2.5 мин)
  item-merge-radius: 3.5 # Радиус слияния дропа (дефолт 2.5)
  # Arrow despawn
  arrow-despawn-rate: 600
  # ТНТ оптимизация
  tnt-entity-height-nerf: true
  # Парсинг команд блоков
  command-block-tick-rate: 2

Пояснение по хопперам: disable-move-event: true ломает некоторые плагины логгирования (CoreProtect, Prism), но дает +15-30% CPU на тех. серверах. Если нужны логи — поставьте false, но добавьте плагин HopperOptimizer или FastHopper.

5. Настройка spigot.yml — классика оптимизации

Файл: /home/minecraft/spigot.yml.

# /home/minecraft/spigot.yml
settings:
  # Сохранение структур (end cities, villages) — отключаем лишние проверки
  save-structure-info: false
  # Лимит сущностей (глобальный)
  entity-activation-range:
    animals: 16
    monsters: 24
    raiders: 48
    misc: 8
    water: 8
    villagers: 16
    flying-monsters: 48
  # Тики сущностей вне радиуса активации
  entity-tracking-range:
    players: 48
    animals: 48
    monsters: 48
    misc: 32
    other: 64
  # Обновление чанков (view-distance ниже в server.properties)
  chunks-per-tick: 650
  # Автосохранение мира
  auto-save-interval: 6000 # 5 минут (дефолт 900 = 45 сек). Меньше дисковые IO, меньше лагов спайка.
  # Лимит тиков на задачу (watchdog)
  max-tick-time:
    tile: 1000
    entity: 1000

6. Настройка bukkit.yml — спавн и тики

Файл: /home/minecraft/bukkit.yml.

# /home/minecraft/bukkit.yml
spawn-limits:
  monsters: 50       # Дефолт 70
  animals: 8         # Дефолт 10
  water-animals: 3   # Дефолт 5
  water-ambient: 1   # Дефолт 2
  ambient: 1         # Дефолт 10
  axolotls: 3
  category:
    monster: 50
    animal: 8
    water_creature: 3
    water_ambient: 1
    ambient: 1
    axolotls: 3

chunk-gc:
  period-in-ticks: 400 # Очистка неиспользуемых чанков из памяти чаще (дефолт 600)

ticks-per:
  animal-spawns: 400   # Дефолт 400
  monster-spawns: 2    # Дефолт 1 (каждый тик). Ставим 2-4.
  water-spawns: 400
  water-ambient-spawns: 400
  ambient-spawns: 400
  axolotl-spawns: 400
  autosave: 6000       # Синхронно с spigot.yml

7. Настройка server.properties — сетевой слой и дистанция

Файл: /home/minecraft/server.properties.

# /home/minecraft/server.properties
# Сетевой движок (Paper использует Netty, но настройки важны)
network-compression-threshold=256
# Дистанция прорисовки (ГЛАВНЫЙ ФАКТОР CPU). Для выделенки 6-8. Не ставьте 10+.
view-distance=6
simulation-distance=5
# Макс. тиков в секунду (не меняйте)
max-tick-time=60000
# Отключаем спавн NPC если не нужно
spawn-npcs=false
# Отключаем анонс достижений в чат (мелочь, но чисто)
announce-player-achievements=false
# Режим онлайн (true для лицензии)
online-mode=true
# Макс. игроков (реалистично под железо)
max-players=80
# Использовать нативный транспорт (epoll/kqueue) — ОБЯЗАТЕЛЬНО для Linux
use-native-transport=true

Про view-distance: Каждый чанк в радиусе 6 — это ~113 чанков на игрока.