- •Предисловие
- •Об этой книге
- •Глава 1. Обзор статистики
- •Внутреннее устройство PostgreSQL
- •Установка соединений и работа сеансов
- •Запросы как базовая единица рабочей нагрузки
- •Планирование и выполнение запросов
- •Ввод-вывод при выполнении запросов
- •Журнал сообщений СУБД
- •Репликация изменений
- •Архивирование журнала предзаписи
- •Фоновая синхронизация данных
- •Автоочистка
- •Интерфейс статистики
- •Статистика как отправная точка инструментов мониторинга
- •Особенности статистики
- •Тестовое окружение
- •Глава 2. Статистика активности
- •Ключ к пониманию происходящего в СУБД
- •Взаимодействие клиента и сервера
- •Источники информации об активности
- •Представление pg_stat_activity
- •Представление pg_locks
- •Особенности pg_stat_activity и pg_locks
- •Представление pg_stat_database
- •Подключенные клиенты
- •Отслеживание клиентских сеансов
- •Транзакционная активность
- •Статусы завершения сеансов
- •Состояния сеансов
- •Отслеживание состояний
- •Ожидания и блокировки
- •Отслеживание состояний с учетом ожиданий
- •Взаимоблокировки
- •Бездействующие транзакции
- •Время выполнения запросов и транзакций
- •Отслеживание времени ожидания блокировок
- •Использование pg_locks.waitstart
- •Использование pg_stat_activity.state_change
- •Дерево блокировок
- •Глава 3. Выполнение запросов и функций
- •Зачем нужен мониторинг запросов
- •Расширение pg_stat_statements
- •Метаданные запроса
- •Планирование запроса
- •Исполнение запроса
- •Сквозная идентификация с queryid
- •Построение отчетов на основе pg_stat_statements
- •Представление pg_stat_statements_info
- •Выполнение процедур и функций
- •Глава 4. Базы данных
- •Иерархия объектов СУБД
- •Кластер баз данных
- •Табличные пространства
- •Базы данных
- •Схемы
- •Таблицы и индексы
- •TOAST
- •События в кластере баз данных
- •Рабочая нагрузка в отношении таблиц и индексов
- •Ошибки и нежелательные события
- •Функции для работы с объектами СУБД
- •Определение размеров объектов СУБД
- •Размещение объектов в файловой системе
- •Глава 5. Область общей памяти и ввод-вывод
- •Анализ общей памяти
- •Представление pg_buffercache
- •Представление pg_shmem_allocations
- •Анализ памяти клиентских процессов
- •Оценка использования SLRU-кешей
- •Ввод-вывод в контексте объектов СУБД
- •Базы данных
- •Ввод-вывод в контексте выполнения запросов
- •Временные файлы
- •Уровень баз данных
- •Ввод-вывод при выполнении запросов
- •Отслеживание в журнале сообщений
- •Отслеживание активных временных файлов
- •Ввод-вывод фоновых процессов
- •Глава 6. Журнал упреждающей записи
- •Отслеживание активности в журнале
- •Представление pg_stat_wal
- •Представление pg_stat_statements
- •Архивирование журнала
- •Представление pg_stat_archiver
- •Очередь архивирования
- •Глава 7. Репликация
- •Обзор репликации
- •Инструменты отслеживания репликации
- •Представление pg_stat_replication
- •Представление pg_stat_wal_receiver
- •Cлоты репликации и pg_replication_slots
- •Публикации и подписки
- •Конфликты восстановления
- •Глава 8. Очистка
- •Введение в очистку
- •Особенности очистки на практике
- •Когда выполняется автоочистка?
- •Статистика выполнения очистки
- •Счетчик транзакций и предотвращение ошибок, связанных с его зацикливанием
- •Раздувание таблиц и индексов
- •Отслеживание активных процессов очистки
- •Представление pg_stat_activity
- •Представление pg_stat_progress_vacuum
- •Глава 9. Ход выполнения операций
- •Представление pg_stat_progress_analyze
- •Представление pg_stat_progress_basebackup
- •Представление pg_stat_progress_cluster
- •Представление pg_stat_progress_create_index
- •Представление pg_stat_progress_copy
- •Предметный указатель
2.4. Подключенные клиенты |
39 |
подолгу пребывать в одном и том же состоянии. Хорошим примером является оставленный надолго сеанс разработчика в IDE;
•active_time—время,проведенное сеансами в состояниях active и fastpath function call,
которые соответствуют выполнению запросов;
•idle_in_transaction_time—время,проведенноевсостоянияхidleintransactionиidlein transaction (aborted).
Обратитевнимание:средиперечисленныхполейнетстатистикиовремени,проведенномвсостоянии idle.Именно это значение придется считатьсамостоятельно,вычитая из общего времени время,проведенное в бездействующих транзакциях,и время выполнения запросов.
Все значения в этих полях выражаются в миллисекундах.
Статистика по базам данных, которую предоставляет pg_stat_database, имеет кумулятивный характер и накапливается с течением времени, что обеспечивает непрерывность ее учета без риска потерь, как это может быть в случае pg_stat_activity или pg_locks. С помощью отдельныхфункцийадминистраторможетсбрасыватьстатистику,чтобыначатьпроцесснакопления заново. В представлении есть поле stats_reset, которое показывает время, когда статистика была сброшена. С его помощью можно вычислить, за какой интервал времени была накоплена статистика.
2.4. Подключенные клиенты
Сталкиваясь с новой ситуацией или незнакомым окружением, в первую очередь важно оценить общую картину происходящего,получить общее представление отом окружении,в котором предстоитнайти и устранитьвозникшую проблему.Для меня в начале знакомства с СУБД важно понимать то, насколько активно используется система и кто ее пользователи. Обычно это информация о том, сколько и каких клиентов подключено к системе, из чего можно сделать примерный вывод о том, сколько ресурсов им может потребоваться, какую нагрузку они могут генерировать.
Естьдва способа получитьтакую информацию.Первый способ—использоватьпредставление pg_stat_database:
#SELECT datname, numbackends FROM pg_stat_database ORDER BY numbackends DESC;
datname |
| numbackends |
|
----------- |
+ |
------------- |
pgbench |
| |
32 |
postgres |
| |
1 |
|
| |
0 |
template1 | |
0 |
|
template0 | |
0 |
|
40Глава 2. Статистика активности
В выводе запроса для каждой базы можно увидеть текущее количество клиентских процессов, подключенных к ней. Однако представление pg_stat_database показывает информацию о подключенных клиентах только в контексте баз данных, что может быть недостаточно для более детального анализа. Также обратите внимание на строку с пустым именем в результате запроса: это служебная строка, объединяющая в себе статистику по разделяемым объектам, которыедоступнывовсехБД,ноприэтомнепринадлежатниоднойизних.Всетакиеобъекты принадлежат системному каталогу.
Системный каталог
Системный каталог — это набор таблиц со служебной информацией, которая используется самойСУБД.Служебныеданныевключаютвсебяинформациюотаблицах,полях,индексах, типах данных и т. д. Практически все DDL-команды типа CREATE, ALTER, DROP как раз оперируютданными системного каталога1.
Второй способ получить информацию о подключенных клиентах, к тому же гораздо более по- дробную,—использовать представление pg_stat_activity:
#SELECT client_addr, usename, datname, count(*) FROM pg_stat_activity
GROUP BY 1,2,3
ORDER BY 4 DESC; |
|
|
|
|
|
client _ addr | usename |
| |
datname |
| count |
||
--------------+ |
---------- |
+ |
---------- |
+ |
------- |
192.168.64.8 | |
classic |
| |
pgbench |
| |
19 |
192.168.64.4 | |
maru |
| |
pgbench |
| |
15 |
| |
|
| |
|
| |
5 |
192.168.64.7 | |
serral |
| |
pgbench |
| |
4 |
192.168.64.5 | |
replica |
| |
|
| |
1 |
192.168.64.9 | |
pgbench |
| |
pgbench |
| |
1 |
| |
postgres | |
|
| |
1 |
|
| |
postgres | |
postgres |
| |
1 |
|
Вэтомпримереклиентысгруппированыпоадресуподключения,именипользователяиимени БД.Можно сделать следующие выводы:
•есть два адреса,откуда идет основная масса подключений;
•наибольшая часть подключений приходится на базу pgbench;
•c базой работают несколько пользователей.
Значение NULLдля client_addr означает,что подключение выполнено через UNIX-сокет стого же узла, где запущен сервер СУБД, — скорее всего, это наше подключение через psql. Также можно видеть NULL-значения в полях usename и datname— обычно такие строки соответствуют фоновым службам.В полном выводе pg_stat_activityможно увидетьбольше подобных строк.
1 postgrespro.ru/docs/postgresql/current/catalogs
2.4. Подключенные клиенты |
41 |
Обычно для отсеивания фоновых служб и отображения только клиентских сеансов использу-
ется условие backend_type = 'client backend'.
Способ для ранних версий PostgreSQL
Поле backend_type появилось в PostgreSQL 10, а в более ранних версиях можно прибегнуть кусловиямвродеdatnameISNULL.Какправило,фоновыепроцессынеподключаютсякбазам данных,за исключением процессов автоочистки.
Используя дополнительное условие,можно исключить фоновые процессы из выборки и получить информацию только по клиентским процессам:
#SELECT client_addr, usename, datname, count(*) FROM pg_stat_activity
WHERE backend_type = 'client backend' GROUP BY 1,2,3
ORDER BY 4 DESC;
client _ addr | |
usename |
| datname |
| count |
|
--------------+ |
---------- |
+---------- |
+ |
------- |
192.168.64.8 | |
classic |
| pgbench |
| |
19 |
192.168.64.4 | |
maru |
| pgbench |
| |
11 |
192.168.64.7 | |
serral |
| pgbench |
| |
5 |
192.168.64.9 | |
pgbench |
| pgbench |
| |
1 |
| |
postgres |
| postgres |
| |
1 |
На практике при анализе проблем приходится использовать группировку и по другим полям и также применять разные условия в зависимости от поставленных вопросов и проверяемых гипотез.
Отслеживание клиентских сеансов
Получение информации с помощью SQL удобно, однако на практике часто приходится анализировать проблемы после того, как они уже исчезли, и нужны информация в исторической перспективе и динамика изменений во времени. Эти задачи решаются системами мониторинга,которыесобирают,хранятивизуализируютстатистику.Спомощьюмониторингаадминистратор имеет возможность рассматривать изменение статистики во времени с помощью графиков.
Для мониторинга необходимо всегда иметь в распоряжении информацию о подключенных клиентах, при этом информация должна быть достаточно подробной. Давайте рассмотрим практическиепримерытого,какможетвыглядетьстатистикапоклиентаминакакиевопросы она может ответить.
42Глава 2. Статистика активности
Для получения суммарного количества подключенных клиентов можно использовать следующий PromQL-запрос:
#sum(postgres_connected_clients_total{service_id="primary"})
График,который можно построить на основе этого запроса,продемонстрирован на рис. 2.1.
Рис. 2.1.Общее количество клиентов
На графике видно, как менялось количество подключений за последний час. В дополнение к основным метрикам указано и ограничение количества одновременных подключений, что наглядно дает понять, сколько еще подключений можно установить до достижения предела. Ограничение количества подключений задается параметром max_connections и по умолчанию равно 100. Из графика можно сделать вывод, что установлено чуть меньше половины от разрешенного ограничения и запас еще имеется.
Метрики параметров конфигурации
Параметры СУБД тоже доступны в виде метрик. Например, с помощью метрики postgres_service_settings_info{name="max_connections"} можно получить значение пара-
метра max_connections.
Метрика postgres_connected_clients_total содержит в себе метки address, user и database,
группировкой по которым можно воспользоваться, чтобы получить статистику в разных проекциях.Начнем с группировки по адресам:
# sum by (address) (postgres_connected_clients_total{service_id="primary"})
2.4. Подключенные клиенты |
43 |
График будетвыглядетьтак,как показано на рис. 2.2.Нанем видно,чтобóльшая частьсеансов установлены с адресов 192.168.64.8 и 192.168.64.4. В окружениях с большим количеством экземпляров приложений такой график позволяет определять адреса, которые используют аномально много сеансов.
Рис. 2.2.Количество клиентов по адресам подключения
Теперь изменим условие группировки на имя пользователя, чтобы получить представление о том,какие пользователи подключаются к СУБД (рис. 2.3):
Рис. 2.3.Количество клиентов по именам пользователей
На графике видно, что большая часть сеансов выполнена от двух прикладных пользователей. Если присмотреться еще, то можно отметить, что выделяется пользователь stats. В тестовом окружении под этим пользователем подключается экспортер метрик для снятия статистики. Для экспортера, да и для любого другого агента мониторинга, такое количество соединений слишком велико,что является поводом для оптимизации кода.
