Этот дашборд в Grafana предоставляет комплексный обзор производительности вашей базы данных PostgreSQL. Он помогает выявлять узкие места, оптимизировать медленные SQL-запросы и обеспечивать стабильную работу ваших приложений.
- Обзор
- Ключевые разделы дашборда
- Описание панелей
- Установка
- Как использовать дашборд для оптимизации
- Совместное использование с другими дашбоардами
- Документация
- Лицензия
Этот дашборд создан для администраторов баз данных и разработчиков, чтобы в реальном времени отслеживать состояние PostgreSQL. Основное внимание уделяется двум аспектам:
- общей нагрузке на базу данных,
- производительности отдельных SQL-запросов (используя расширение
pg_stat_statements
).
Этот раздел дает высокоуровневое представление о здоровье вашей БД. Он помогает быстро оценить текущую нагрузку и количество клиентских подключений.
Это сердце дашборда. Здесь вы можете найти самые "дорогие" запросы, которые потребляют больше всего ресурсов. Анализ этих данных - ключ к оптимизации производительности.
- Что показывает: Общее количество транзакций (коммиты + откаты) в секунду.
- Зачем нужно: Помогает понять общую активность базы данных. Резкие скачки или падения могут указывать на изменения в нагрузке или проблемы.
- Что показывает: Текущее количество активных подключений в сравнении с установленным максимумом (
max_connections
). - Зачем нужно: Постоянно высокое количество подключений или приближение к лимиту может привести к отказам в обслуживании. Это может быть сигналом к оптимизации пула соединений в приложении.
- Что показывает: Самые часто выполняемые запросы.
- Зачем нужно: Даже быстрые, но очень частые запросы могут создавать значительную нагрузку. Оптимизация таких запросов (например, через кеширование на стороне приложения) может дать большой выигрыш.
- Что показывает: Запросы, которые в сумме потратили больше всего времени CPU. Это произведение количества вызовов на среднее время выполнения.
- Зачем нужно: Это главный кандидат на оптимизацию! Запрос может быть не самым медленным, но если он выполняется тысячи раз, его суммарное влияние огромно.
- Что показывает: Запросы с самым большим средним временем выполнения.
- Зачем нужно: Эти запросы напрямую влияют на "отзывчивость" вашего приложения. Их оптимизация улучшит пользовательский опыт. Часто здесь можно найти запросы, которым не хватает индексов.
- Что показывает: Интерактивная таблица со всеми отслеживаемыми запросами и их метриками (вызовы, общее время, среднее время).
- Зачем нужно: Позволяет глубоко анализировать данные. Вы можете сортировать запросы по разным параметрам, фильтровать их и копировать текст запроса для дальнейшего анализа с помощью
EXPLAIN ANALYZE
.
- Убедитесь, что у вас установлен и настроен Prometheus с
pg_exporter
(или аналогичным экспортером метрик PostgreSQL). - Убедитесь, что в PostgreSQL включено расширение
pg_stat_statements
. - В Grafana перейдите в раздел Dashboards.
- Нажмите New и выберите Import.
- Загрузите предоставленный JSON-файл или вставьте его содержимое в текстовое поле.
- Выберите ваш источник данных Prometheus и завершите импорт.
- Начните с "Топ-10 запросов по общему времени выполнения". Это самые важные цели.
- Скопируйте текст проблемного запроса из таблицы "Детализация SQL-запросов".
- Используйте
EXPLAIN ANALYZE
вpsql
илиpgAdmin
, чтобы посмотреть план выполнения запроса. - Ищите узкие места:
- Sequential Scans на больших таблицах (часто указывает на отсутствие индекса),
- Вложенные циклы (Nested Loops) с большим количеством итераций и т.д.
- Создайте необходимые индексы или перепишите запрос.
- Наблюдайте за дашбордом после внесения изменений, чтобы оценить эффект.
- CPU Usage: Загрузка процессора (по ядрам и в целом). Помогает понять, не упирается ли производительность в "железо".
- Memory Usage: Использование оперативной памяти. Важно отслеживать, чтобы избежать ухода в swap.
- Disk I/O: Активность дисков (чтение/запись в секунду, утилизация). Высокая утилизация диска — явный признак узкого места.
- Network Traffic: Сетевой трафик. Полезно для понимания общего объема передаваемых данных.
-
Cache Hit Rate (Коэффициент попадания в кэш):
- Index Hit Rate:
pg_statio_user_indexes
- Table (Heap) Hit Rate:
pg_statio_user_tables
- Цель: Значения должны быть как можно ближе к 99%+. Низкий показатель говорит о том, что БД постоянно читает с диска, и, возможно, стоит увеличить
shared_buffers
.
- Index Hit Rate:
-
Vacuum и Autovacuum:
- Количество "мертвых" кортежей (dead tuples) в таблицах (
pg_stat_user_tables
). - Время последнего автовакуума для каждой таблицы.
- Зачем: Помогает отслеживать, справляется ли автовакуум со своей работой. Большое количество мертвых кортежей раздувает таблицы и снижает производительность.
- Количество "мертвых" кортежей (dead tuples) в таблицах (
-
Locks (Блокировки):
- График, показывающий количество и длительность активных блокировок.
- Особенно важно отслеживать блокировки, которые ожидают (
waiting = true
). Помогает находить "зависшие" транзакции, блокирующие работу других.
-
Replication Status (Статус репликации):
- Replication Lag: Отставание реплики от мастера в байтах или секундах. Критически важный показатель для систем с высокой доступностью.
-
Temporary Files (Временные файлы):
- Количество и размер временных файлов, создаваемых PostgreSQL.
- Если их много, это может означать, что
work_mem
недостаточно для сложных сортировок и соединений в памяти.
-
Логирование медленных запросов: Настройте
log_min_duration_statement
в PostgreSQL и собирайте логи с помощью Promtail в Loki. Это позволит вам видеть медленные запросы с конкретными параметрами, а не обобщенные, как вpg_stat_statements
. -
Бизнес-транзакции: Свяжите технические метрики с бизнес-процессами. Например:
- "среднее время оформления заказа"
- "количество регистраций в минуту"
Это поможет показать влияние технических проблем на бизнес.
Собрав все это на одном или нескольких связанных дашбордах, вы получите 360-градусный обзор вашей системы и сможете решать проблемы проактивно, а не после жалоб пользователей.
Документация доступна здесь.