vm:ubuntu:02-swapv3

Решение проблемы 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 недостаточно для текущей инфраструктуры

# Создаем дополнительный 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
# Добавляем в /etc/fstab для автомонтирования при загрузке
echo '/swapfile2 none swap sw 0 0' | sudo tee -a /etc/fstab
 
# Проверяем fstab
cat /etc/fstab | grep swap
# Устанавливаем 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 (каждый час в 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
docker-compose.yml
services:
  chatwoot_sidekiq:
    environment:
      - RAILS_MAX_THREADS=5
      - SIDEKIQ_CONCURRENCY=5
    deploy:
      resources:
        limits:
          memory: 512M
docker-compose.yml
services:
  zabbix_web:
    environment:
      - PHP_FPM_PM=ondemand
      - PHP_FPM_PM_MAX_CHILDREN=10
    deploy:
      resources:
        limits:
          memory: 256M
docker-compose.yml
services:
  n8n:
    environment:
      - NODE_OPTIONS=--max-old-space-size=256
    deploy:
      resources:
        limits:
          memory: 512M

Применить для всех 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"
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

Триггер 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)

Краткосрочные меры (выполнено):

  1. [x] Увеличить swap до 6GB
  2. [x] Оптимизировать swappiness
  3. [x] Настроить мониторинг
  4. [x] Настроить логирование

Среднесрочные меры:

  1. [ ] Оптимизировать настройки всех контейнеров
  2. [ ] Проанализировать возможность отключения неиспользуемых сервисов
  3. [ ] Оптимизировать PostgreSQL инстансы
  4. [ ] Рассмотреть консолидацию PostgreSQL (один инстанс для нескольких сервисов)

Долгосрочные меры:

  1. [ ] Увеличить RAM до 8-16GB
  2. [ ] Рассмотреть вынос части сервисов на отдельный сервер
  3. [ ] Настроить горизонтальное масштабирование для критичных сервисов
# Быстрая проверка памяти
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
  • vm/ubuntu/02-swapv3.txt
  • Последнее изменение: 2025/12/16 19:32
  • admin