Предварительный материал.
КАТЕГОРИЯ: ТРЕВОГА (требует немедленного вмешательства)
1. vm_dirty & so (swap-out): r > 0.5 (положительная)
Интерпретация:
Даже умеренная положительная корреляция указывает на критическую нехватку оперативной памяти. Система начинает вытеснять страницы процессов PostgreSQL в swap, чтобы освободить место для "грязных" страниц или других нужд. Это приводит к катастрофическому падению производительности (лавинообразное замедление).
Рекомендуемые действия:
- Немедленная проверка:sql-- Проверка использования памяти процессами PostgreSQL
- SELECT pid, usename, application_name,
- pg_size_pretty(pg_total_relation_size(oid)) as relation_size,
- state, wait_event_type, wait_event
- FROM pg_stat_activity
- WHERE state = 'active';
- Оперативные меры:
- Увеличить shared_buffers (если это основная БД)
- Проверить и уменьшить work_mem для предотвращения избыточного использования
- Настроить параметры ядра: уменьшить vm.dirty_background_ratio и vm.dirty_ratio
- Рассмотреть добавление оперативной памяти
- Долгосрочные решения:
- Оптимизировать запросы с большими сортировками/hash
- Внедрить мониторинг OOM-рисков
- Рассмотреть partitioning больших таблиц
2. vm_dirty & wa (время ожидания I/O): r > 0.7 (положительная)
Интерпретация:
Сильная корреляция означает, что подсистема ввода-вывода не справляется с нагрузкой записи. Накопление "грязных" страниц приводит к блокировкам процессов в ожидании завершения операций записи на диск. Типично при активных checkpoint, интенсивной записи WAL или bulk-операциях.
Рекомендуемые действия:
- Диагностика узких мест I/O:bash# Проверка текущей нагрузки на диски
- iostat -x 1 10
- # Проверка очереди запросов
- cat /sys/block/sdX/queue/nr_requests
- Настройка PostgreSQL:sql-- Увеличение интервала между checkpoint
- ALTER SYSTEM SET checkpoint_timeout = '30min';
- -- Увеличение максимального объема данных для checkpoint
- ALTER SYSTEM SET max_wal_size = '4GB';
- -- Ускорение работы background writer
- ALTER SYSTEM SET bgwriter_delay = '200ms';
- ALTER SYSTEM SET bgwriter_lru_maxpages = 1000;
- Оптимизация ОС и железа:
- Размещение WAL на отдельном быстром диске (NVMe)
- Использование более быстрого RAID-массива
- Настройка elevator noop или deadline для SSD
- Увеличение параметров ядра vm.dirty_writeback_centisecs
3. vm_dirty & b (процессы в ожидании I/O): r > 0.7 (положительная)
Интерпретация:
Процессы СУБД массово блокируются в состоянии ожидания операций ввода-вывода. Это подтверждает и дополняет проблему, выявленную парой vm_dirty & wa. Очередь процессов в состоянии b указывает на системный I/O bottleneck.
Рекомендуемые действия:
- Идентификация заблокированных процессов:sql-- Поиск процессов, ожидающих I/O
- SELECT pid, query, wait_event_type, wait_event, state
- FROM pg_stat_activity
- WHERE wait_event_type = 'IO'
- OR state = 'active'
- AND query LIKE '%COPY%'
- OR query LIKE '%CREATE TABLE%';
- Срочные меры:
- Принудительный запуск checkpoint: CHECKPOINT;
- Остановка несущественных операций записи
- Временное увеличение vm.dirty_expire_centisecs
- Мониторинг и анализ:sql-- Анализ паттернов записи
- SELECT
- pg_stat_get_bgwriter_timed_checkpoints() as timed_checkpoints,
- pg_stat_get_bgwriter_requested_checkpoints() as requested_checkpoints,
- pg_stat_get_buffers_checkpoint() as buffers_checkpoint,
- pg_stat_get_buffers_clean() as buffers_clean,
- pg_stat_get_maxwritten_clean() as maxwritten_clean;
КАТЕГОРИЯ: ВНИМАНИЕ (требует оптимизации)
1. vm_dirty & bo (blocks sent to device): r < 0.3 (слабая положительная)
Интерпретация:
Слабая корреляция между объемом "грязных" страниц и фактической записью на диск свидетельствует о том, что механизм обратной записи не успевает за генерацией dirty pages. Это может быть как из-за медленного диска, так и из-за агрессивной работы приложения.
Рекомендуемые действия:
- Анализ паттернов записи:bash# Мониторинг активности записи с детализацией по процессам
- iotop -oP
- # Анализ накопившихся dirty страниц
- grep -E "Dirty:|Writeback:" /proc/meminfo
- Настройка параметров ядра:bash# Увеличение частоты записи
- echo 500 > /proc/sys/vm/dirty_writeback_centisecs
- echo 10 > /proc/sys/vm/dirty_background_ratio
- echo 20 > /proc/sys/vm/dirty_ratio
- Оптимизация в PostgreSQL:sql-- Настройка асинхронной записи для определенных таблиц
- ALTER TABLE large_table SET (timescaledb.compress = true);
- -- Включение WAL-архивирования для уменьшения нагрузки
- ALTER SYSTEM SET archive_mode = on;
2. vm_dirty & free (свободная память): r < -0.7 (сильная отрицательная)
Интерпретация:
Сильная отрицательная корреляция указывает на то, что система агрессивно использует всю доступную память для кэширования, практически не оставляя свободного запаса. Это риск перехода в состояние "memory pressure".
Рекомендуемые действия:
- Мониторинг использования памяти:sql-- Статистика использования памяти PostgreSQL
- SELECT name, setting, unit,
- (setting::bigint * 8192) / 1024 / 1024 as size_mb
- FROM pg_settings
- WHERE name IN ('shared_buffers', 'work_mem', 'maintenance_work_mem');
- Настройка ограничений:bash# Настройка cgroups для ограничения памяти PostgreSQL
- systemctl set-property postgresql.service MemoryHigh=8G MemoryMax=10G
- Профилактические меры:
- Регулярный мониторинг trend'ов использования памяти
- Настройка аварийных действий при нехватке памяти
- Внедрение connection pooling для контроля за количеством соединений
3. vm_dirty & sy (время ядра): r > 0.6 (положительная)
Интерпретация:
Умеренная/сильная корреляция указывает на высокие накладные расходы ядра ОС на управление памятью и операциями ввода-вывода. Ядро тратит значительное время на обработку страниц памяти, что может снижать общую производительность.
Рекомендуемые действия:
- Анализ активности ядра:bash# Профилирование системных вызовов
- perf top -e syscalls:sys_enter_*
- strace -c -p $(pgrep -f postgres | head -1)
- Оптимизация системных параметров:bash# Настройка параметров управления памятью
- echo 1 > /proc/sys/vm/overcommit_memory
- echo 80 > /proc/sys/vm/overcommit_ratio
- # Оптимизация параметров TCP для уменьшения нагрузки
- echo "net.core.rmem_max=16777216" >> /etc/sysctl.conf
- Оптимизация конфигурации PostgreSQL:sql-- Уменьшение нагрузки на ядро через оптимизацию WAL
- ALTER SYSTEM SET wal_compression = on;
- ALTER SYSTEM SET full_page_writes = off; -- Только если есть непрерывное бэкапирование
ОБЩИЙ АЛГОРИТМ ДЕЙСТВИЙ ПРИ ОБНАРУЖЕНИИ КОРРЕЛЯЦИЙ
- Подтверждение проблемы:
- Проверить устойчивость корреляции на разных временных интервалах
- Исключить влияние внешних факторов (бэкапы, обслуживание)
- Сравнить с baseline'ом системы
- Приоритизация действий:sql-- Оценка критичности проблем
- SELECT
- metric_pair,
- correlation_strength,
- p_value,
- CASE
- WHEN metric_pair LIKE '%so%' THEN 1
- WHEN metric_pair LIKE '%wa%' THEN 2
- WHEN metric_pair LIKE '%b%' THEN 3
- ELSE 4
- END as priority_level
- FROM correlation_analysis_results
- WHERE p_value < 0.05
- ORDER BY priority_level, correlation_strength DESC;
- Пост-оптимизационный мониторинг:
- Контрольные замеры через 1, 4, 24 часа после изменений
- A/B-тестирование конфигураций на staging-окружении
- Документирование всех изменений и их эффекта
Важное предупреждение: Корреляции указывают на взаимосвязь, но не доказывают причинно-следственную связь. Всегда проводите дополнительную диагностику с помощью:
- EXPLAIN ANALYZE проблемных запросов
- Мониторинга pg_stat_statements
- Анализа логов PostgreSQL (log_min_duration_statement)