Решение проблемы 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
Диагностика
Проверка текущего состояния
# Общая информация о памяти и 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}}"
Результаты диагностики
Топ потребители памяти:
- 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
# Создаем дополнительный 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
Результат:
Swap: 6.0Gi 1.5Gi 4.5Gi NAME TYPE SIZE USED PRIO /swap.img file 2G 1.5G -2 /swapfile2 file 4G 0B -3
2. Добавление в автозагрузку
# Добавляем в /etc/fstab для автомонтирования при загрузке echo '/swapfile2 none swap sw 0 0' | sudo tee -a /etc/fstab # Проверяем fstab cat /etc/fstab | grep swap
3. Оптимизация swappiness
# Устанавливаем swappiness=10 (оптимально для серверов) # Значение 10 означает, что система будет использовать swap только при острой необходимости sudo sysctl vm.swappiness=10 # Делаем изменение постоянным echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf # Проверяем применение настройки cat /proc/sys/vm/swappiness
Результат: Swappiness изменен с 60 на 10
Мониторинг
Создание скрипта мониторинга
# Создаём директорию для скриптов 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
Настройка ротации логов
# Создаём конфигурацию 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
Добавление в cron
Частота мониторинга: каждый час
# Добавляем задачу в 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
Формат cron: 0 * * * *
Где: Минута Час День Месяц ДеньНедели
Примеры других частот:
*/30 * * * *- каждые 30 минут*/15 * * * *- каждые 15 минут0 */2 * * *- каждые 2 часа0 */6 * * *- каждые 6 часов0 2 * * *- раз в день в 02:00
Просмотр логов мониторинга
# Последние 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
Оптимизация контейнеров
Chatwoot (если используется не активно)
- docker-compose.yml
services: chatwoot_sidekiq: environment: - RAILS_MAX_THREADS=5 - SIDEKIQ_CONCURRENCY=5 deploy: resources: limits: memory: 512M
Zabbix Web оптимизация
- docker-compose.yml
services: zabbix_web: environment: - PHP_FPM_PM=ondemand - PHP_FPM_PM_MAX_CHILDREN=10 deploy: resources: limits: memory: 256M
n8n ограничение памяти
- docker-compose.yml
services: n8n: environment: - NODE_OPTIONS=--max-old-space-size=256 deploy: resources: limits: memory: 512M
PostgreSQL контейнеры общая оптимизация
Применить для всех PostgreSQL: synapse_db, zabbix_postgres, chatwoot_postgres, evolution_postgres
- 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"
Matrix Synapse оптимизация
- homeserver.yaml
caches: global_factor: 0.5 # Снижаем с 1.0 до 0.5
Или через переменные окружения в docker-compose.yml:
- docker-compose.yml
services: synapse_app: environment: - SYNAPSE_CACHE_FACTOR=0.5
Настройка 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 дней
Текущие показатели:
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
Долгосрочные рекомендации
Критично
<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
- [ ] Рассмотреть вынос части сервисов на отдельный сервер
- [ ] Настроить горизонтальное масштабирование для критичных сервисов
Полезные команды
# Быстрая проверка памяти 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
Связанные документы
Дата создания: 2025.12.16
Автор: Nick
Статус: Выполнено
Сервер: srv01