====== Решение проблемы 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 (если используется не активно) ====
services:
chatwoot_sidekiq:
environment:
- RAILS_MAX_THREADS=5
- SIDEKIQ_CONCURRENCY=5
deploy:
resources:
limits:
memory: 512M
==== Zabbix Web оптимизация ====
services:
zabbix_web:
environment:
- PHP_FPM_PM=ondemand
- PHP_FPM_PM_MAX_CHILDREN=10
deploy:
resources:
limits:
memory: 256M
==== n8n ограничение памяти ====
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
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 оптимизация ====
caches:
global_factor: 0.5 # Снижаем с 1.0 до 0.5
Или через переменные окружения в 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
===== Долгосрочные рекомендации =====
==== Критично ====
4GB RAM недостаточно для текущей инфраструктуры!
**Рекомендуемые параметры сервера:**
* **Минимум:** 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
===== Связанные документы =====
* [[infrastructure:monitoring:zabbix|Настройка Zabbix мониторинга]]
* [[infrastructure:docker:optimization|Оптимизация Docker контейнеров]]
* [[infrastructure:matrix:synapse|Matrix Synapse конфигурация]]
* [[infrastructure:databases:postgresql|PostgreSQL оптимизация]]
----
**Дата создания:** 2025.12.16\\
**Автор:** Nick\\
**Статус:** Выполнено\\
**Сервер:** srv01