Показать страницуИстория страницыСсылки сюдаНаверх Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно. ====== Решение проблемы High swap usage на srv01 ====== ===== Описание проблемы ===== **Сервер:** srv01\\ **Проблема:** Linux: High swap space usage (less than 50% free)\\ **Время возникновения:** 13:59:12 on 2025.12.15\\ **Severity:** Warning\\ **Параметры:** Free: 47.65%, total: 2 GB **Характеристики сервера:** * RAM: 4GB * Swap (до увеличения): 2GB * Использование swap: ~65% (1.3GB из 2GB) * Swappiness: 60 (по умолчанию) **Запущенные сервисы:** * Matrix/Synapse + PostgreSQL * n8n (341MB) * Chatwoot + Sidekiq + PostgreSQL + Redis * Zabbix + PostgreSQL * Evolution API + PostgreSQL + Redis * DokuWiki * Nginx Proxy Manager + PostgreSQL * Teleport * LiveKit + JWT Service * Element Web/Call * pgVector + pgAdmin ===== Диагностика ===== ==== Проверка текущего состояния ==== <code bash> # Общая информация о памяти и swap free -h # Детальная информация о swap swapon --show # Текущее значение swappiness cat /proc/sys/vm/swappiness # Топ процессов по использованию памяти ps aux --sort=-%mem | head -15 # Использование памяти контейнерами Docker docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}" </code> ==== Результаты диагностики ==== **Топ потребители памяти:** * n8n: 341MB (8.71%) * chatwoot_sidekiq: 207.5MB (5.30%) * zabbix_web: 141.2MB (3.61%) * zabbix_postgres: 103MB (2.63%) * synapse_app: 88.24MB (2.25%) * synapse_db: 85.89MB (2.19%) * nginxpm: 61.86MB (1.58%) **Итого Docker контейнеры:** ~1.2GB\\ **Вывод:** 4GB RAM недостаточно для текущей инфраструктуры ===== Решение ===== ==== 1. Увеличение swap до 6GB ==== <code bash> # Создаем дополнительный swap файл 4GB sudo dd if=/dev/zero of=/swapfile2 bs=1M count=4096 status=progress # Устанавливаем права доступа sudo chmod 600 /swapfile2 # Инициализируем swap sudo mkswap /swapfile2 # Активируем swap sudo swapon /swapfile2 # Проверяем результат free -h swapon --show </code> **Результат:** <code> Swap: 6.0Gi 1.5Gi 4.5Gi NAME TYPE SIZE USED PRIO /swap.img file 2G 1.5G -2 /swapfile2 file 4G 0B -3 </code> ==== 2. Добавление в автозагрузку ==== <code bash> # Добавляем в /etc/fstab для автомонтирования при загрузке echo '/swapfile2 none swap sw 0 0' | sudo tee -a /etc/fstab # Проверяем fstab cat /etc/fstab | grep swap </code> ==== 3. Оптимизация swappiness ==== <code bash> # Устанавливаем swappiness=10 (оптимально для серверов) # Значение 10 означает, что система будет использовать swap только при острой необходимости sudo sysctl vm.swappiness=10 # Делаем изменение постоянным echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf # Проверяем применение настройки cat /proc/sys/vm/swappiness </code> **Результат:** Swappiness изменен с 60 на 10 ===== Мониторинг ===== ==== Создание скрипта мониторинга ==== <code bash> # Создаём директорию для скриптов mkdir -p /opt/scripts mkdir -p /opt/scripts/logs # Создаём скрипт мониторинга памяти cat > /opt/scripts/check_mem.sh << 'EOF' #!/bin/bash echo "=== Memory Report: $(date) ===" echo "" echo "Memory & Swap:" free -h echo "" echo "Swap details:" swapon --show echo "" echo "Top 10 memory consumers:" ps aux --sort=-%mem | head -11 echo "" echo "Docker containers memory:" docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}" | sort -k3 -rn | head -15 echo "========================================" echo "" EOF # Делаем скрипт исполняемым chmod +x /opt/scripts/check_mem.sh # Тестируем работу скрипта /opt/scripts/check_mem.sh </code> ==== Настройка ротации логов ==== <code bash> # Создаём конфигурацию logrotate для хранения логов за 7 дней cat > /etc/logrotate.d/mem_monitor << 'EOF' /opt/scripts/logs/mem_monitor.log { daily rotate 7 compress missingok notifempty create 0644 root root } EOF </code> ==== Добавление в cron ==== **Частота мониторинга:** каждый час <code bash> # Добавляем задачу в cron (каждый час в 0 минут) (crontab -l 2>/dev/null; echo "0 * * * * /opt/scripts/check_mem.sh >> /opt/scripts/logs/mem_monitor.log 2>&1") | crontab - # Проверяем установленные задачи cron crontab -l </code> **Формат cron:** ''0 * * * *''\\ Где: ''Минута Час День Месяц ДеньНедели'' **Примеры других частот:** * ''*/30 * * * *'' - каждые 30 минут * ''*/15 * * * *'' - каждые 15 минут * ''0 */2 * * *'' - каждые 2 часа * ''0 */6 * * *'' - каждые 6 часов * ''0 2 * * *'' - раз в день в 02:00 ==== Просмотр логов мониторинга ==== <code bash> # Последние 100 строк лога tail -100 /opt/scripts/logs/mem_monitor.log # Мониторинг в реальном времени tail -f /opt/scripts/logs/mem_monitor.log # Поиск по дате grep "2025.12.16" /opt/scripts/logs/mem_monitor.log # Анализ использования swap grep "Swap:" /opt/scripts/logs/mem_monitor.log | tail -20 # Просмотр архивных логов ls -lh /opt/scripts/logs/ zcat /opt/scripts/logs/mem_monitor.log.1.gz | less </code> ===== Оптимизация контейнеров ===== ==== Chatwoot (если используется не активно) ==== <file yaml docker-compose.yml> services: chatwoot_sidekiq: environment: - RAILS_MAX_THREADS=5 - SIDEKIQ_CONCURRENCY=5 deploy: resources: limits: memory: 512M </file> ==== Zabbix Web оптимизация ==== <file yaml docker-compose.yml> services: zabbix_web: environment: - PHP_FPM_PM=ondemand - PHP_FPM_PM_MAX_CHILDREN=10 deploy: resources: limits: memory: 256M </file> ==== n8n ограничение памяти ==== <file yaml docker-compose.yml> services: n8n: environment: - NODE_OPTIONS=--max-old-space-size=256 deploy: resources: limits: memory: 512M </file> ==== PostgreSQL контейнеры общая оптимизация ==== Применить для всех PostgreSQL: synapse_db, zabbix_postgres, chatwoot_postgres, evolution_postgres <file yaml docker-compose.yml> services: postgres: command: - "postgres" - "-c" - "shared_buffers=64MB" - "-c" - "effective_cache_size=256MB" - "-c" - "maintenance_work_mem=32MB" - "-c" - "work_mem=2MB" - "-c" - "max_connections=50" </file> ==== Matrix Synapse оптимизация ==== <file yaml homeserver.yaml> caches: global_factor: 0.5 # Снижаем с 1.0 до 0.5 </file> Или через переменные окружения в docker-compose.yml: <file yaml docker-compose.yml> services: synapse_app: environment: - SYNAPSE_CACHE_FACTOR=0.5 </file> ===== Настройка Zabbix триггеров ===== ==== Обновление триггеров для мониторинга swap ==== **Триггер Warning (обновленный):** * Name: ''Linux: High swap space usage (less than 25% free)'' * Expression: ''{srv01:vfs.swap.size[,pfree]}<25'' * Severity: Warning **Триггер High (новый):** * Name: ''Linux: Critical swap space usage (less than 10% free)'' * Expression: ''{srv01:vfs.swap.size[,pfree]}<10'' * Severity: High ===== Результаты ===== **После применения решения:** * ✅ Swap увеличен: 2GB → 6GB * ✅ Использование swap: 65% → 25% * ✅ Swappiness оптимизирован: 60 → 10 * ✅ Автоматический мониторинг настроен * ✅ Логирование с ротацией за 7 дней **Текущие показатели:** <code> total used free shared buff/cache available Mem: 3.8Gi 2.1Gi 140Mi 124Mi 2.0Gi 1.7Gi Swap: 6.0Gi 1.5Gi 4.5Gi </code> ===== Долгосрочные рекомендации ===== ==== Критично ==== <WRAP center round important 60%> 4GB RAM недостаточно для текущей инфраструктуры! </WRAP> **Рекомендуемые параметры сервера:** * **Минимум:** 8GB RAM * **Оптимально:** 16GB RAM * **Swap:** 4-6GB (при увеличении RAM) ==== План действий ==== **Краткосрочные меры (выполнено):** - [x] Увеличить swap до 6GB - [x] Оптимизировать swappiness - [x] Настроить мониторинг - [x] Настроить логирование **Среднесрочные меры:** - [ ] Оптимизировать настройки всех контейнеров - [ ] Проанализировать возможность отключения неиспользуемых сервисов - [ ] Оптимизировать PostgreSQL инстансы - [ ] Рассмотреть консолидацию PostgreSQL (один инстанс для нескольких сервисов) **Долгосрочные меры:** - [ ] Увеличить RAM до 8-16GB - [ ] Рассмотреть вынос части сервисов на отдельный сервер - [ ] Настроить горизонтальное масштабирование для критичных сервисов ===== Полезные команды ===== <code bash> # Быстрая проверка памяти free -h # Проверка swap swapon --show # Текущее значение swappiness cat /proc/sys/vm/swappiness # Запуск скрипта мониторинга вручную /opt/scripts/check_mem.sh # Просмотр последних логов tail -50 /opt/scripts/logs/mem_monitor.log # Топ процессов по памяти ps aux --sort=-%mem | head -15 # Docker контейнеры - использование памяти docker stats --no-stream # Проверка cron задач crontab -l # Логи cron grep CRON /var/log/syslog | tail -20 </code> ===== Связанные документы ===== * [[infrastructure:monitoring:zabbix|Настройка Zabbix мониторинга]] * [[infrastructure:docker:optimization|Оптимизация Docker контейнеров]] * [[infrastructure:matrix:synapse|Matrix Synapse конфигурация]] * [[infrastructure:databases:postgresql|PostgreSQL оптимизация]] ---- **Дата создания:** 2025.12.16\\ **Автор:** Nick\\ **Статус:** Выполнено\\ **Сервер:** srv01 vm/ubuntu/02-swapv3.txt Последнее изменение: 2025/12/16 19:32 — admin