- •Предисловие
- •Об этой книге
- •Глава 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.3. Источники информации об активности |
31 |
Одной из задач администратора БД является отслеживание, выяснение причин и предотвращение таких ситуаций.Далее в этой главе мы рассмотрим эти ситуации более подробно.
2.3. Источники информации об активности
Мы начнем с представлений pg_stat_activity, pg_locks и pg_stat_database. С исторической точки зрения возможности отображения активности развивались постепенно и со временем пришликтомувиду,вкоторомониестьнаданныймомент.Враннихверсияхэтитрипредставления содержали информацию, которая тематически не была связана между собой. Представ-
ления pg_stat_activity и pg_locks могли дополнятьдругдруга,а pg_stat_database не содержа-
ла той статистики, что будет рассматриваться далее. Сейчас все три представления содержат различную информацию, которую объединяет одна тема — определение активности. Все три представления помогают составить общую картину происходящего в СУБД:
•pg_stat_activity—статистика о процессах,подключенных клиентах и фоновых службах;
•pg_locks — статистика о блокировках, удерживаемых или ожидаемых активными процессами;
•pg_stat_database—кумулятивнаястатистикаоклиентскихсеансахвконтекстеотдельных баз данных.
Соглашение об именовании
Здесь и далее в тексте при указании представлений и их полей будет использоваться нотация представление.поле.Например,pg_stat_activity.pid указывает на поле pid в представ-
лении pg_stat_activity.
Представление pg_stat_activity
Весьмойпрактическийопытпоискаиустраненияпроблемговоритотом,чтопривозникновении самых разных подозрений на проблемы в работе СУБД pg_stat_activity—главный источник первичной информации. Если с точки зрения операционной системы администратор можетувидетьтолько процессы,то pg_stat_activityпомогаетадминистратору заглянутьвнутрь СУБД и посмотреть на работу этих же процессов, но с точки зрения самой PostgreSQL. В представлении содержится информация обо всех процессах СУБД, будь то клиентские процессы или фоновые службы, и каждая строка описывает отдельный серверный процесс. В ранних версияхPostgreSQLpg_stat_activityсодержалоинформациюпреимущественнооклиентских процессах. В следующих версиях была добавлена информация о фоновых службах. При этом клиентские процессы и фоновые службы отличаются характером работы с СУБД и часть информации,котораяприсущаклиентскимпроцессам,дляфоновыхслужбпопростуотсутствует.
32Глава 2. Статистика активности
Но недостаток информации по фоновым процессам компенсируется другими представлениями, и pg_stat_activity остается наиболее ценным источником сведений о внутренней активности СУБД.
Посмотреть полное описание этого представления можно с помощью метакоманды \d+ pg_stat_activity.
Метакоманды
Клиент psql содержит набор метакоманд, полезных для получения справочной информации об объектах БД,как пользовательских,так и системных.Все метакоманды начинаются с символа обратной косой черты \, например \d. Для получения справки и списка всех метакоманд используйте метакоманду \?.
Ниже приведено сокращенное описание представления.
# \d pg_stat_activity |
|
|
|
||
|
|
View "pg_catalog.pg_stat_activity" |
|
|
|
Column |
| |
Type |
| Collation |
| Nullable | Default |
|
------------------+--------------------------+-----------+----------+--------- |
|||||
datid |
| |
oid |
| |
| |
| |
datname |
| |
name |
| |
| |
| |
pid |
| |
integer |
| |
| |
| |
leader_pid |
| |
integer |
| |
| |
| |
usesysid |
| |
oid |
| |
| |
| |
usename |
| |
name |
| |
| |
| |
application_name | |
text |
| |
| |
| |
|
client_addr |
| |
inet |
| |
| |
| |
client_hostname |
| |
text |
| |
| |
| |
client_port |
| |
integer |
| |
| |
| |
backend_start |
| |
timestamp with time zone | |
| |
| |
|
xact_start |
| |
timestamp with time zone | |
| |
| |
|
query_start |
| |
timestamp with time zone | |
| |
| |
|
state_change |
| |
timestamp with time zone | |
| |
| |
|
wait_event_type | |
text |
| |
| |
| |
|
wait_event |
| |
text |
| |
| |
| |
state |
| |
text |
| |
| |
| |
backend_xid |
| |
xid |
| |
| |
| |
backend_xmin |
| |
xid |
| |
| |
| |
query_id |
| |
bigint |
| |
| |
| |
query |
| |
text |
| |
| |
| |
backend_type |
| |
text |
| |
| |
| |
Вывод статистики |
в pg_stat_activity |
представляет |
собой |
таблицу на основе функции |
|
pg_stat_get_activity,где каждая строка описывает конкретный серверный процесс.
Давайте рассмотрим,какую полезную информацию можно получить из представления.
2.3. Источники информации об активности |
33 |
Информация о клиенте. Основные реквизиты соединения:
•client_addr — сетевой адрес, с которого выполнено подключение. Если соединение установлено через UNIX-сокет,значение будет отсутствовать (NULL);
•client_port—номер порта в удаленной системе,с которого установлено соединение;
•usename—имя пользователя,используемое при подключении;
•datname—имя базы данных,к которой выполнено подключение.
Для лучшей идентификации клиент при подключении может обозначить себя через отдельный идентификатор application_name. Это удобный способ отличать приложения в случаях, когда они подключены с одинаковыми реквизитами и с одного адреса.Поле backend_type позволяет отличать клиентские процессы от фоновых служб. В ранних версиях СУБД этого поля не было, и для определения клиентских подключений приходилось прибегать к различным уловкам—например,указывать в SQL-запросе дополнительное условие datname IS NOT NULL.
#SELECT
row_number() OVER (ORDER BY pid) AS n,
pid, backend_type, client_addr, application_name, usename, datname
FROM pg_stat_activity |
|
|
|
|
|
|||
LIMIT |
15; |
|
|
|
|
|
|
|
n |
| |
pid |
| |
backend_type |
| client_addr |
| application_name | usename |
| datname |
|
----+ |
-------- |
+------------------------------ |
|
+-------------- |
+------------------ |
+---------- |
+---------- |
|
1 |
| |
65 |
| checkpointer |
| |
| |
| |
| |
|
2 |
| |
66 |
| background writer |
| |
| |
| |
| |
|
3 |
| |
67 |
| walwriter |
| |
| |
| |
| |
|
4 |
| |
68 |
| autovacuum launcher |
| |
| |
| |
| |
|
5 |
| |
69 |
| archiver |
|
| |
| |
| |
| |
6 |
| |
71 |
| logical replication launcher | |
| |
| postgres |
| |
||
7 |
| |
117 |
| walsender |
| 192.168.64.5 |
| walreceiver |
| replica |
| |
|
8 |
| |
209017 |
| client backend |
| |
| psql |
| postgres | postgres |
||
9 |
| |
224802 |
| client backend |
| |
| psql |
| postgres |
| postgres |
|
10 |
| |
230568 |
| client backend |
| 192.168.64.9 |
| pgbench |
| pgbench |
| pgbench |
|
11 |
| |
231751 |
| client backend |
| 192.168.64.4 |
| pgbench |
| maru |
| pgbench |
|
12 |
| |
231752 |
| client backend |
| 192.168.64.4 |
| pgbench |
| maru |
| pgbench |
|
13 |
| |
231753 |
| client backend |
| 192.168.64.4 |
| pgbench |
| maru |
| pgbench |
|
14 |
| |
231754 |
| client backend |
| 192.168.64.4 |
| pgbench |
| maru |
| pgbench |
|
15 |
| |
231755 |
| client backend |
| 192.168.64.4 |
| pgbench |
| maru |
| pgbench |
|
Этот пример наглядно показывает различия между фоновыми службами (строки с 1-й по 7-ю) и клиентскими процессами (строки с 8-й по 15-ю). Во-первых, отличить их можно по значению поля backend_type. Во-вторых, для фоновых служб могут отсутствовать значения других полей,например client_addr,application_name,usename и datname,поскольку фоновые процес-
сы могут запускаться локально или не устанавливать соединений к БД.
Продолжительностьсеанса,транзакции,запроса. В представлении естьинформация,относяща-
яся ко времени начала сеанса и той активности,что происходит в сеансе:
• backend_start—время начала сеанса,то есть момент подключения клиента к СУБД;
34Глава 2. Статистика активности
•xact_start—время начала текущей транзакции;
•query_start — время начала текущего запроса — на случай, если это не единственный запрос в транзакции.
С помощью этих полей можно выявлять длительные запросы и транзакции, нехарактерные для конкретной рабочей нагрузки.
Состояние сеанса. Сеанс в течение своего жизненного цикла может находиться в разных состояниях. По состоянию можно определить, все ли в порядке с сеансом, и принять меры, если с ним что-то не так. На состояние сеанса указывает поле state. Также в поле state_change доступно время перехода в текущее состояние, по которому можно определить его продолжительность. Далее по этим полям мы будем отслеживать потенциально опасную активность в БД и ее продолжительность.
Ожидания и блокировки. ВнутренняямеханикаСУБДпредполагаетиспользованиеразныхмеханизмов синхронизации; хорошим примером являются блокировки, которые используются длясериализациидоступакобъектам.Следствиемиспользованиятакихмеханизмовявляется риск возникновения ожиданий на разных участках выполнения кода. Для отслеживания ожиданий СУБД предоставляет поля wait_event и wait_event_type, которые детально идентифицируют место, где возникло ожидание. С помощью полей state, wait_event_type и wait_event можно определять узкие места в работе СУБД, где происходит ожидание вместо выполнения полезной работы.
Идентификаторитекстзапроса. ВполеqueryуказанытекстывыполняющихсявСУБДзапросов. Поле ограничено размером буфера,который регулируется параметром track_activity_query_size (поумолчанию1КБ).Текствыявленногомедленногозапросадаетадминистраторуотправную точку для оптимизации производительности. Запрос можно воспроизвести, получить план выполнения,проанализировать производительность и в результате наметитьдействия по оптимизации. Дополнительно для каждого запроса формируется уникальный идентификатор queryid, который в сочетании с полями usesysid и datid можно использовать для соединения с представлением pg_stat_statements, в результате чего будут получены дополнительные сведения о том,сколько ресурсов было использовано этим запросом и ему подобными.
Идентификаторы процессов. Все процессы в pg_stat_activity являются процессами операционной системы и имеют присвоенный ею уникальный идентификатор pid. Этот идентификатор доступен в статистике и является ключом, с помощью которого можно соединять pg_stat_activity с другими представлениями. Например, это может понадобиться для получения расширенной информации о блокировках или ходе выполнения отдельных операций.
СУБД умеет распределять выполнение частей запроса между несколькими процессами, ускоряя выполнение запросов и увеличивая эффективность использования многоядерных систем. При наблюдении важно отделять группу процессов, занятых выполнением параллельного запроса от всех остальных процессов или групп. Для этой цели служит поле leader_pid, которое у всех дочерних процессов указывает на pid родительского процесса.
