АРХИВА 10 Help

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

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

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

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

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

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

  • Метапространство (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 → устанавливает жесткий лимит прямой памяти.

  • -XX:SoftMaxDirectMemorySize=32g → позволяет JVM адаптивно снижать использование прямой памяти при дефиците ресурсов.

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

  • -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 файлами требует увеличения данного параметра:

    sudo sysctl -w vm.max_map_count=262144

    Для сохранения изменений после перезагрузки:

    echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
  4. Настройте системные лимиты (ulimit)
    Для обеспечения стабильности под высокой нагрузкой увеличьте лимиты процессов и открытых файлов:

    # В файле /etc/security/limits.conf добавьте: * soft nofile 65536 # Максимум открытых файлов (индексы, логи, сокеты) * hard nofile 65536 * soft nproc 65536 # Максимум процессов/потоков (пулы Tomcat, потоки ZGC) * hard nproc 65536

    После внесения изменений перезагрузите систему или перезайдите в сессию.

  5. Оптимизируйте Transparent HugePages для ZGC
    Для достижения наилучшей производительности ZGC установите режим madvise, что поможет избежать длительных пауз:

    # Проверка текущего режима cat /sys/kernel/mm/transparent_hugepage/enabled # Установка режима madvise echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled # Для автоматизации при загрузке создайте systemd-сервис: # /etc/systemd/system/disable-thp.service

    Описание режимов:

    • always — может вызвать значительные паузы в работе ZGC (не рекомендуется).

    • madvise — оптимальный вариант для ZGC (рекомендуется).

    • never — безопасный, но менее производительный режим.

🔧 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. Его размер напрямую зависит от объема оперативной памяти (RAM) и предполагаемой нагрузки. Применение 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.

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

Инструкция по добавлению или изменению SWAP

Выполните следующие шаги для настройки swap-файла в Linux:

1. Проверка текущего состояния

sudo swapon --show

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

Например, для создания файла объемом 64 ГБ:

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

(Замените 65536 на требуемое число мегабайт).

3. Настройка прав доступа

sudo chmod 600 /swapfile

4. Форматирование файла в swap

sudo mkswap /swapfile

5. Активация swap

sudo swapon /swapfile

6. Обеспечение автозапуска после перезагрузки

Добавьте запись в /etc/fstab:

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

7. Финальная проверка

sudo swapon --show

Оптимизация параметров ядра для SWAP

Для минимизации влияния swap на производительность JVM и улучшения работы с индексами (которые используют mmap), рекомендуется скорректировать параметры в /etc/sysctl.conf:

# Минимальная склонность к swap (предотвращает выгрузку heap в swap, что критично для GC) echo 'vm.swappiness=1' | sudo tee -a /etc/sysctl.conf # Оптимизация кэша inode/dentry (ускоряет работу Lucene с миллионами мелких файлов) echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf # Оптимизация записи грязных страниц (снижает IO-пики при сбросе данных на диск) echo 'vm.dirty_background_ratio=3' | sudo tee -a /etc/sysctl.conf echo 'vm.dirty_ratio=10' | sudo tee -a /etc/sysctl.conf echo 'vm.dirty_expire_centisecs=3000' | sudo tee -a /etc/sysctl.conf # Увеличение лимита сегментов mmap (необходимо для больших индексов) echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf # Применение изменений без перезагрузки sudo sysctl -p

Параметр

Оценка

Комментарий

vm.swappiness=1

✅ Оптимально

Предотвращает преждевременный сброс страниц heap в swap, что исключает серьезные задержки (page faults) при работе сборщика мусора.

vm.vfs_cache_pressure=50

✅ Хорошо

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

vm.dirty_background_ratio=3

⚖️ Хорошо

Обеспечивает плавную фоновую запись данных на диск, избегая резких скачков нагрузки.

vm.dirty_ratio=10

✅ Оптимально

Ограничивает объем «грязных» страниц в памяти, минимизируя риск возникновения длительных IO-блокировок.

vm.dirty_expire_centisecs=3000

⚖️ Допустимо

Время жизни грязных страниц (30 сек). На быстрых SSD можно увеличить до 6000 (60 сек) для повышения общей пропускной способности.

vm.max_map_count=262144

⚠️ Минимум

При наличии десятков миллионов документов индексы могут потребовать большего значения. Рекомендуется установить 1 048 576 (1 M) для уверенности.

Итог

  • Используйте G1GC для систем с RAM < 64 ГБ и ZGC для более мощных серверов.

  • Правильно распределите Direct Memory и Soft Direct Memory для баланса производительности и стабильности.

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

  • Регулярно мониторьте показатели GC и общее потребление ресурсов.

  • Настройте SWAP согласно рекомендациям, используя SSD-накопители.

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

24 August 2026