Содержание

Решение проблемы 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

Характеристики сервера:

Запущенные сервисы:

Диагностика

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

# Общая информация о памяти и 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}}"

Результаты диагностики

Топ потребители памяти:

Итого 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 * * * *
Где: Минута Час День Месяц ДеньНедели

Примеры других частот:

Просмотр логов мониторинга

# Последние 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 (обновленный):

Триггер High (новый):

Результаты

После применения решения:

Текущие показатели:

               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>

Рекомендуемые параметры сервера:

План действий

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

  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

Связанные документы


Дата создания: 2025.12.16
Автор: Nick
Статус: Выполнено
Сервер: srv01