АРХИВА 10 Help

Настройка памяти

Для стабильной работы важно правильно настроить JVM, особенно параметры памяти и сборщика мусора (GC), чтобы обеспечить оптимальную производительность. Оба сборщика — ZGC (Z Garbage Collector) и G1GC (G1 Garbage Collector) — предназначены для работы с большими кучами и обеспечивают низкие задержки. Выбор между ними зависит от ваших требований к производительности.

Основные принципы настройки:

  • Heap (куча JVM): Максимум 50% от общей RAM.

  • Direct Memory (прямая память): 15–25% для индексов (особенно при больших объемах данных).

  • Soft Direct Memory (мягкое ограничение): Позволяет JVM гибко управлять использованием direct memory.

  • Метапространство (Metaspace): 512 МБ – 2 ГБ.

  • Кэш ОС для файловой системы: 25–35% RAM для ускорения доступа к индексам и данным.

Выбор сборщика мусора (GC)

Объем RAM

Рекомендуемый GC

2–64 ГБ

G1GC

64–512 ГБ

ZGC

✅ G1GC (< 64 ГБ RAM)

G1GC хорошо балансирует между низкими паузами и пропускной способностью.

Конфигурация для G1GC:

-XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -XX:+ParallelRefProcEnabled \ -XX:+DisableExplicitGC \ -XX:+AlwaysPreTouch \ -XX:+UseStringDeduplication

🚀 ZGC (> 64 ГБ RAM)

ZGC обеспечивает ультра-низкие паузы (до 10 мс) и отлично подходит для больших куч.

Конфигурация для ZGC:

-XX:+UseZGC \ -XX:+ParallelRefProcEnabled \ -XX:+DisableExplicitGC \ -XX:+AlwaysPreTouch \ -XX:+UseStringDeduplication

Конфигурация памяти в зависимости от RAM

RAM

Heap (Xmx/Xms)

DirectMemory

SoftDirectMemory

Парсер

2 ГБ

1 ГБ

256 МБ

128 МБ

512 МБ

8 ГБ

4 ГБ

2 ГБ

1 ГБ

1 ГБ

32 ГБ

16 ГБ

6 ГБ

4 ГБ

2 ГБ

128 ГБ

64 ГБ

24 ГБ

16 ГБ

4 ГБ

512 ГБ

256 ГБ

100 ГБ

64 ГБ

8 ГБ

Полный пример конфигурации JVM (128 ГБ RAM)

Пример конфигурации, которая балансирует использование heap, direct memory, индексов и парсера с использованием ZGC:

JAVA_OPTS="-Xms64g -Xmx64g \ -XX:MaxDirectMemorySize=48g \ -XX:SoftMaxDirectMemorySize=32g \ -XX:+UseZGC \ -XX:+AlwaysPreTouch \ -XX:+UseStringDeduplication \ -XX:+ParallelRefProcEnabled \ -XX:+DisableExplicitGC \ -XX:SoftMaxHeapSize=48g \ -XX:MaxGCPauseMillis=500 \ -Dindex.storage.type=mmap \ -Dparser.memory.limit=8g"

Объяснение параметров:

  • -Xms64g -Xmx64g → Выделяет 50% от RAM для heap.

  • -XX:MaxDirectMemorySize=48g → Жесткое ограничение direct memory.

  • -XX:SoftMaxDirectMemorySize=32g → Позволяет JVM гибко уменьшать direct memory при нехватке ресурсов.

  • -XX:+UseZGC → GC с ультра-низкими задержками.

  • -XX:+AlwaysPreTouch → Улучшает предсказуемость работы памяти.

  • -XX:+UseStringDeduplication → Уменьшает расход памяти для строк.

  • -XX:+ParallelRefProcEnabled → Ускоряет обработку ссылок (WeakReference, SoftReference).

  • -XX:+DisableExplicitGC → Блокирует System.gc() для предотвращения внезапных пауз.

  • -XX:SoftMaxHeapSize=48g → Позволяет JVM снижать использование heap при необходимости.

  • -XX:MaxGCPauseMillis=500 → Задаёт целевую задержку GC (настраиваемо).

  • -Dindex.storage.type=mmap → Оптимизирует работу индексов с использованием memory-mapped файлов.

  • -Dparser.memory.limit=8g → Ограничивает память, выделенную для парсера.

Дополнительные рекомендации

  1. Оставьте достаточно памяти для файлового кэша АРХИВА активно использует файловый ввод-вывод, поэтому 25–35% RAM лучше зарезервировать для ОС.

  2. Используйте логирование GC Включите журналирование, чтобы следить за сборкой мусора:

    -Xlog:gc*:file=/var/log/gc.log:time,uptime:filecount=10,filesize=100M
  3. Настройте max_map_count для индексов
    Memory-mapped файлы требуют увеличенного max_map_count:

    sudo sysctl -w vm.max_map_count=262144

    Чтобы сделать изменение постоянным:

    echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

🔧 Bash-скрипт для автоматической настройки JVM

#!/bin/bash RAM_TOTAL=$(free -g | awk '/^Mem:/{print $2}') RAM_HALF=$((RAM_TOTAL / 2)) RAM_DIRECT=$((RAM_TOTAL / 4)) RAM_SOFT_DIRECT=$((RAM_TOTAL / 6)) RAM_PARSER=$((RAM_TOTAL / 20)) [ $RAM_HALF -gt 256 ] && RAM_HALF=256 [ $RAM_DIRECT -lt 2 ] && RAM_DIRECT=2 [ $RAM_SOFT_DIRECT -lt 1 ] && RAM_SOFT_DIRECT=1 [ $RAM_PARSER -gt 8 ] && RAM_PARSER=8 if [ $RAM_TOTAL -lt 64 ]; then GC="-XX:+UseG1GC -XX:MaxGCPauseMillis=200" else GC="-XX:+UseZGC" fi JVM_OPTS=" -Xms${RAM_HALF}g -Xmx${RAM_HALF}g \ $GC \ -XX:+AlwaysPreTouch \ -XX:+ParallelRefProcEnabled \ -XX:+UseStringDeduplication \ -XX:+DisableExplicitGC \ -XX:MaxDirectMemorySize=${RAM_DIRECT}g \ -XX:SoftMaxDirectMemorySize=${RAM_SOFT_DIRECT}g \ -Dindex.storage.type=mmap \ -Dparser.memory.limit=${RAM_PARSER}g " echo "Настроенные параметры JVM:" echo "$JVM_OPTS"

Рекомендации по настройке SWAP

Для систем с большим объемом памяти, особенно с SSD дисками, важно правильно настроить swap. Размер swap зависит от объема оперативной памяти (RAM) и предполагаемой нагрузки. Использование SSD-дисков для swap значительно ускоряет операции с памятью, так как SSD обеспечивают гораздо более высокую скорость чтения/записи по сравнению с традиционными жесткими дисками.

Рекомендации по настройке SWAP в зависимости от объема RAM

RAM (GB)

Рекомендуемый размер SWAP

Тип диска

2–8 ГБ

2–4 ГБ

SSD / HDD

8–16 ГБ

4–8 ГБ

SSD / HDD

16–32 ГБ

8–16 ГБ

SSD

32–64 ГБ

16–32 ГБ

SSD

64–128 ГБ

32–64 ГБ

SSD

128–256 ГБ

64–128 ГБ

SSD

> 256 ГБ

128–256 ГБ

SSD

  • Рекомендации: Для высоконагруженных систем или при использовании больших наборов данных и индексов рекомендуется использовать SSD для swap, так как скорость обмена данными с SSD значительно выше, чем с HDD.

  • Размер swap: Обычно рекомендуется устанавливать swap размером 1–2x объем RAM для систем с менее интенсивной нагрузкой, но для более сложных сценариев (например, многозадачность или работа с большими индексами) можно установить swap до 3x RAM.

Как добавить или изменить swap

Для добавления или изменения swap на Linux, выполните следующие шаги:

1. Проверка текущего размера swap

sudo swapon --show

2. Создание swap-файла

Для создания swap-файла, например, размером 64 ГБ:

sudo dd if=/dev/zero of=/swapfile bs=1M count=65536

Замените 65536 на нужное количество блоков для swap в МБ (64 ГБ = 65536 МБ).

3. Установка правильных прав доступа к файлу

sudo chmod 600 /swapfile

4. Создание swap-формата для файла

sudo mkswap /swapfile

5. Включение swap

sudo swapon /swapfile

6. Постоянное включение swap после перезагрузки

Добавьте запись в файл /etc/fstab, чтобы swap был включен после перезагрузки:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

7. Проверка нового размера swap

sudo swapon --show

Рекомендации по параметрам swap

  • swappiness: Настройка swappiness влияет на то, когда система начинает использовать swap.
    Рекомендуется устанавливать значение swappiness=10, чтобы система использовала swap только при недостатке памяти.

    Для изменения swappiness временно:

    sudo sysctl vm.swappiness=10

    Чтобы сделать изменения постоянными, добавьте строку в файл /etc/sysctl.conf:

    vm.swappiness=10

Итог

  • Используйте G1GC для RAM < 64 ГБ, ZGC для больших систем.

  • Настройте Direct Memory и Soft Direct Memory для лучшего баланса между производительностью и потреблением ресурсов.

  • Оставляйте место для ОС и кэширования файловой системы.

  • Мониторьте GC и потребление памяти для своевременной оптимизации.

  • Используйте SWAP при больших объемах памяти.

Такое конфигурирование обеспечит стабильную работу АРХИВА даже в высоконагруженных сценариях. 🔥

03 April 2025