Периоды наблюдения:
Конфигурация СУБД и инфраструктуры:
Источник данных:
Отчёт основан на предоставленных сводных метриках и статистическом анализе за указанные периоды. 🟢
Периоды наблюдения:
Конфигурация СУБД и инфраструктуры:
Источник данных:
Отчёт основан на предоставленных сводных метриках и статистическом анализе за указанные периоды. 🟢
...Читать далее
Оглавление
Общая информация
Периоды наблюдения:
- Период 1 (P1): 2026-03-11 14:35 – 15:35 (тестовый отрезок) 🟢
- Период 2 (P2): 2026-03-11 15:35 – 16:35 (инцидент производительности) 🟢
Конфигурация СУБД и инфраструктуры:
- Версия PostgreSQL: 15.13 🟢
- Аппаратная платформа: 192 логических ядра (Intel Xeon Platinum 8280L), 1007.58 GB RAM, NUMA (4 узла) 🟢
- Ключевые параметры PostgreSQL:
- shared_buffers = 251807 MB (~246 GB) 🟢
- effective_cache_size = 747230 MB (~730 GB) 🟢
- work_mem = 1 GB 🟢
- maintenance_work_mem = 16 GB 🟢
- checkpoint_timeout = 15 min 🟢
- max_wal_size = 8 GB 🟢
- wal_keep_size = 500 GB 🟢
- random_page_cost = 1.1 🟢
- effective_io_concurrency = 300 🟢
- max_parallel_workers_per_gather = 0 🟢
- synchronous_commit = remote_write 🟢
- Дисковая подсистема:
- WAL на отдельном устройстве vdg 🟢
- Данные на LVM-группе из устройств vdh, vdi, vdj, vdk 🟢
Источник данных:
Отчёт основан на предоставленных сводных метриках и статистическом анализе за указанные периоды. 🟢
Ключевые проблемы СУБД и инфраструктуры
1. Деградация операционной скорости при усилении обратной связи с ожиданиями
- В P2 операционная скорость (SPEED) перешла от слабого роста к устойчивому падению (R²=0.94, наклон -44.09). 🟢
- Ожидания СУБД (WAITINGS) в P2 приобрели выраженный положительный тренд (R²=0.58, наклон +37.28). 🟢
- Корреляция SPEED ~ WAITINGS усилилась с умеренной обратной (r=-0.5469) до сильной обратной (r=-0.7712). 🟢
2. Дисковая подсистема данных стала узким местом
- Утилизация (%util) устройств данных (vdh–vdk) в P2 превысила 90% (медиана до 90.33%), при этом в P1 уже была высокой (86–87%). 🟢
- Средняя длина очереди запросов (aqu_sz) выросла с ~2.0 до ~2.5. 🟢
- Появилась очень высокая корреляция операционной скорости с пропускной способностью записи на устройства данных (r≈0.73, R²≈0.54). В P1 связь была слабой. 🟢
- Высокая корреляция между wa (CPU iowait) и util устройств данных (r≈0.80–0.84) в P2 подтверждает влияние дисковой нагрузки на общую производительность. 🟢
3. Рост нагрузки на WAL и появление ожиданий WALSync
- Запись на WAL-устройство vdg в P2 увеличилась вдвое по сравнению с P1: w/s с 373 до 689, wMB/s с 7.75 до 16.0. 🟢
- В структуре ожиданий IO появилось событие WALSync (11.03% от всех IO-ожиданий), отсутствовавшее в P1. 🟢
- Утилизация vdg осталась низкой (до 10%), что указывает на отсутствие проблем с пропускной способностью самого устройства, но рост объёма записи и появление синхронизационных ожиданий свидетельствуют об усилении нагрузки на подсистему WAL. 🟢
4. Критический уровень ожиданий LWLock и выход на первый план Extension
- В обоих периодах LWLock имеет критическую взвешенную корреляцию ожиданий (ВКО=0.27 в P1, 0.30 в P2) и доминирует в структуре ожиданий (BufferMapping ~30%, WALWrite ~26%, pgpro_stats ~18%). 🟢
- В P2 тип ожидания Extension получил высокий интегральный приоритет (0.6625) и очень сильную корреляцию с cpu us (r=0.9051) и прерываниями in (r=0.8252). 🟢
- Появление в P2 значимых корреляций для IO и Lock (r≈0.80, R²≈0.65) указывает на расширение спектра конкуренции. 🟡 (Связь статистически значима, но причинно-следственная интерпретация требует дополнительных данных о природе нагрузки.)
5. Конкуренция на уровне строк и появление блокировок tuple
- В P2 в типе ожидания Lock появились события tuple (20.41%), отсутствовавшие в P1, при сохранении доминирования transactionid (78.97%). 🟢
- Это свидетельствует о росте числа конфликтующих операций над одними и теми же строками (например, конкурентные UPDATE/DELETE). 🟡 (Без текстов запросов и планов выполнения точная причина не установлена.)
6. Аномальная активность запроса -5038981907002478858
- Данный запрос демонстрирует резкий рост доли ожиданий Extension (с 8.51% до 33.69%) и LWLock (с 6.10% до 32.24%) в P2 при высоком общем количестве вызовов (≈38.8 млн). 🟢
- Запрос является основным генератором нагрузки на расширения и легковесные блокировки во время инцидента. 🟢
7. Системные ресурсы: память и CPU
- Свободная оперативная память стабильно ниже 5% (≈13 GB) в обоих периодах, при этом swap не используется. 🟢
- Объём файлового кэша ОС (memory_cache) составляет ≈720 GB, что близко к effective_cache_size (730 GB). 🟢
- В P2 зафиксирован устойчивый отрицательный тренд cpu idle (R²=0.79, наклон -41.71), что указывает на рост общей загрузки CPU, лишь частично объясняемый увеличением iowait с 2% до 3%. 🟢
- Детализация по компонентам us/sy в трендовом анализе отсутствует. 🔴
Рекомендации по оптимизации СУБД и инфраструктуры
⚠️ Рекомендации сформулированы как направления для дальнейшей диагностики и возможных изменений. Конкретные значения параметров должны определяться после дополнительного анализа и нагрузочного тестирования.
По СУБД
- Анализ запроса -5038981907002478858
- Получить план выполнения с EXPLAIN (ANALYZE, BUFFERS, TIMING) и трассировку через auto_explain.log_analyze. 🟢
- Идентифицировать используемые расширения и оценить их вклад в потребление CPU и ожидания Extension. 🟡 (Без текста запроса и списка расширений точная причина роста ожиданий Extension неизвестна.)
- Оптимизация конкуренции за LWLock BufferMapping
- Проверить статистику pg_stat_bgwriter на предмет высоких значений buffers_backend_fsync или buffers_alloc. 🟢
- Рассмотреть возможность увеличения shared_buffers (текущие 246 GB при 1007 GB RAM) для снижения частоты обращений к буферному кэшу ОС, но только после анализа hit ratio и влияния на checkpoint. 🟡 (Изменение требует тестирования.)
- Изучить целесообразность изменения lwlock_shared_limit (по умолчанию не задан) для увеличения числа разделов буферного кэша. 🟡 (Эффект зависит от характера конкуренции; требуется анализ статистики ожиданий на уровне отдельных процессов.)
- Снижение нагрузки на WAL и ожиданий WALWrite/WALSync
- Выявить причины удвоения объёма записи WAL: рост числа транзакций, увеличение доли UPDATE/DELETE, операции с большими объёмами данных. 🟢
- Проверить настройки wal_writer_delay, wal_writer_flush_after. 🟡 (Рекомендации по изменению возможны только после анализа текущих значений и задержек.)
- На уровне приложения рассмотреть возможность пакетной обработки мелких транзакций. 🟡 (Требует оценки допустимости с точки зрения бизнес-логики.)
- Устранение блокировок tuple
- Проанализировать логи на предмет сообщений о блокировках и конфликтах. 🟢
- Исследовать состояние pg_stat_user_tables для таблиц с высоким числом n_tup_upd/n_tup_del и отсутствием подходящих индексов. 🟢
- Проверить, используются ли в запросах условия, приводящие к блокировке избыточного числа строк (например, отсутствие индекса на столбце в WHERE при UPDATE/DELETE). 🟡 (Требуется знание схемы данных и текстов запросов.)
- Включение параллелизма запросов
- Оценить возможность изменения max_parallel_workers_per_gather с 0 до значения >0 для операций, потенциально выигрывающих от распараллеливания (seq scan крупных таблиц). 🟢 (При 192 ядрах потенциал значителен, но необходимо тестирование на конкретной нагрузке.)
- Оптимизация расширения pgpro_stats
- Проверить конфигурацию сбора статистики (частота снимков, уровень детализации) на предмет избыточности. 🟡 (Без доступа к настройкам расширения рекомендации не могут быть точными.)
По инфраструктуре
- Дисковая подсистема данных
- Провести детальное профилирование ввода-вывода с помощью iostat -x 1, pidstat -d для выявления процессов, генерирующих наибольшую нагрузку на запись. 🟢
- Проверить равномерность распределения нагрузки между устройствами vdh–vdk (по медианам выглядит сбалансированно, но требуется анализ во времени). 🟢
- Рассмотреть возможность увеличения пропускной способности дисковой группы (добавление устройств, переход на более производительные накопители). 🟡 (Решение зависит от финансовых и технических ограничений.)
- WAL-устройство
- Убедиться, что vdg используется исключительно под WAL и не конкурирует с другими операциями ввода-вывода. 🟢
- Мониторить задержки записи w_await; при их росте оценить необходимость более быстрого накопителя. 🟡 (Текущие задержки низкие, проблема скорее в объёме записи.)
- Память
- Несмотря на стабильно низкий объём свободной памяти (<5%), ситуация может считаться нормальной для выделенного сервера БД при отсутствии подкачки. 🟢
- Рекомендуется мониторинг memory_free и memory_cache для выявления резких провалов кэша, которые могут указывать на вытеснение страниц. 🟢
- CPU
- Провести детальный анализ загрузки CPU с помощью mpstat -P ALL и perf top для выявления компонента, ответственного за устойчивое снижение cpu idle в P2. 🟢
- Исключить влияние steal со стороны гипервизора (KVM). 🟢
Необходимая дополнительная информация для продолжения анализа и оптимизации
Для уточнения причин инцидента и выработки конкретных параметров настройки требуются следующие данные:
- Тексты и планы выполнения проблемных запросов, особенно -5038981907002478858 и -4280293605113329019, с EXPLAIN (ANALYZE, BUFFERS, TIMING, SETTINGS). 🟢
- Трассировка запросов через auto_explain (логи с log_min_duration_statement и auto_explain.log_analyze = on). 🟢
- Статистика PostgreSQL за оба периода:
- pg_stat_bgwriter (для оценки буферной активности и контрольных точек)
- pg_stat_database (конфликты, число транзакций, кортежи)
- pg_stat_user_tables и pg_stat_user_indexes (операции над таблицами, эффективность индексов)
- pg_locks и pg_stat_activity в моменты пиковой нагрузки
- Детализация CPU во временном разрезе (например, mpstat -P ALL 1 или sar -u ALL) для анализа динамики us, sy, wa, id. 🟢
- Полные логи PostgreSQL за периоды P1 и P2 для выявления сообщений о checkpoint, autovacuum, блокировках, ошибках. 🟢
- Информация о характере нагрузки в P2: были ли изменения в бизнес-процессах, запуск новых задач, рост числа подключений и т.д. 🟡 (Поможет отделить случайные флуктуации от системных изменений.)
- Список и конфигурация установленных расширений, особенно тех, что фигурируют в ожиданиях Extension. 🟢
⬛ Без указанных данных глубина анализа ограничена: невозможно точно определить причины роста ожиданий Extension, конкретные места конкуренции за LWLock, оптимальные значения параметров памяти и параллелизма, а также конкретные пути оптимизации запросов.