Документ описывает развертывание, структуру таблиц, использование, настройку и отключение функции статистики запросов YMatrix.
Модуль статистики запросов mxstat собирает информацию о выполнении запросов, включая:
Модуль включен в расширение matrixmgr и устанавливается по умолчанию вместе с системой.
[mxadmin@mdw ~]$ gpconfig -s shared_preload_libraries
Values on all segments are consistent
GUC : shared_preload_libraries
Master value: matrixts,matrixmgr,matrixgate,telemetry,mars2
Segment value: matrixts,matrixmgr,matrixgate,telemetry,mars2
Для просмотра статистики необходимо создать базу данных matrixmgr и установить в ней расширение matrixmgr. (База данных и расширение создаются по умолчанию после инициализации кластера YMatrix.)
createdb matrixmgr
psql -d matrixmgr
matrixmgr=# CREATE EXTENSION matrixmgr CASCADE;
NOTICE: installing required extension "matrixts"
CREATE EXTENSION
После успешного развертывания в схеме matrixmgr_internal базы данных matrixmgr появляются следующие таблицы и представления:
Представление информации о выполнении запросов.
Это представление отображает статистику по запросам, выполненным с момента последнего сбора истории (интервал по умолчанию: 5 минут). Оно включает следующие поля:
| Столбец | Тип | Описание |
|---|---|---|
| seg | integer | Идентификатор сегмента, на котором был сгенерирован и отправлен план запроса |
| userid | oid | OID пользователя |
| dbid | oid | OID базы данных |
| queryid | bigint | Идентификатор запроса, сгенерированный расширением для группировки аналогичных запросов |
| nestlevel | integer | Глубина вложенности |
| query | text | Текст запроса |
| calls_begin | bigint | Количество запусков запроса |
| calls_alive | bigint | Количество запросов, все еще выполняющихся на момент последнего сбора |
| calls_end | bigint | Количество запросов, завершившихся нормально |
| total_time | double precision | Общее время выполнения для данного класса запросов, в миллисекундах |
| min_time | double precision | Минимальное время выполнения для данного класса запросов, в миллисекундах |
| max_time | double precision | Максимальное время выполнения для данного класса запросов, в миллисекундах |
| mean_time | double precision | Среднее время выполнения для данного класса запросов, в миллисекундах |
| stddev_time | double precision | Стандартное отклонение времени выполнения, в миллисекундах |
| sample_planid | bigint | Идентификатор плана выполнения |
| sample_start | timestamp with time zone | Время начала самого медленного запроса |
| sample_parse_done | timestamp with time zone | Время завершения парсинга самого медленного запроса |
| sample_plan_done | timestamp with time zone | Время завершения планирования самого медленного запроса |
| sample_exec_start | timestamp with time zone | Время начала выполнения самого медленного запроса |
| sample_exec_end | timestamp with time zone | Время завершения выполнения самого медленного запроса |
Представление информации о потреблении ресурсов запросами.
Это представление отображает статистику использования ресурсов для запросов, выполненных с момента последнего сбора истории (интервал по умолчанию: 5 минут). Оно включает следующие поля:
| Столбец | Тип | Описание |
|---|---|---|
| seg | integer | Идентификатор сегмента, на котором выполнялся запрос |
| userid | oid | OID пользователя |
| dbid | oid | OID базы данных |
| queryid | bigint | Идентификатор запроса, сгенерированный расширением для группировки аналогичных запросов |
| nestlevel | integer | Глубина вложенности |
| rows | bigint | Общее количество строк, извлеченных или затронутых оператором |
| shared_blks_hit | bigint | Общее количество попаданий в буфер общих блоков |
| shared_blks_read | bigint | Общее количество чтений общих блоков |
| shared_blks_dirtied | bigint | Общее количество изменений общих блоков |
| shared_blks_written | bigint | Общее количество записей общих блоков |
| local_blks_hit | bigint | Общее количество попаданий в буфер локальных блоков |
| local_blks_read | bigint | Общее количество чтений локальных блоков |
| local_blks_dirtied | bigint | Общее количество изменений локальных блоков |
| local_blks_written | bigint | Общее количество записей локальных блоков |
| temp_blks_read | bigint | Общее количество чтений временных блоков |
| temp_blks_written | bigint | Общее количество записей временных блоков |
| blk_read_time | double precision | Общее время, затраченное на чтение блоков, в миллисекундах |
| blk_write_time | double precision | Общее время, затраченное на запись блоков, в миллисекундах |
| ru_utime | double precision | Время процессора пользователя, в секундах |
| ru_stime | double precision | Время процессора системы, в секундах |
| ru_maxrss | bigint | Физическая память, использованная процессом, включая общие библиотеки, в КБ |
| ru_ixrss | bigint | Общий размер разделяемой памяти |
| ru_idrss | bigint | Общий размер не разделяемой данных |
| ru_isrss | bigint | Общий размер не разделяемого стека |
| ru_minflt | bigint | Количество мелких ошибок страниц (без ввода-вывода) |
| ru_majflt | bigint | Количество крупных ошибок страниц (требуется ввод-вывод) |
| ru_nswap | bigint | Количество свопов |
| ru_inblock | bigint | Количество операций ввода, инициированных файловой системой |
| ru_oublock | bigint | Количество операций вывода, инициированных файловой системой |
| ru_msgsnd | bigint | Количество отправленных сообщений |
| ru_msgrcv | bigint | Количество полученных сообщений |
| ru_nsignals | bigint | Количество полученных сигналов |
| ru_nvcsw | bigint | Количество добровольных переключений контекста (процесс передает процессор) |
| ru_nivcsw | bigint | Количество принудительных переключений контекста (истек квант времени или процесс был прерван) |
Это партиционированная таблица, хранящая исторические данные из представления mxstat_execute, собираемые по умолчанию каждые 5 минут. Ее структура соответствует mxstat_execute, с дополнительным столбцом ts_bucket, указывающим время сбора.
Это партиционированная таблица, хранящая исторические данные из представления mxstat_usage, собираемые по умолчанию каждые 5 минут. Ее структура соответствует mxstat_usage, с дополнительным столбцом ts_bucket, указывающим время сбора.
Хранит соответствие между queryid и querytext. Как и другие исторические таблицы, она периодически сохраняет данные, чтобы исторические запросы сохраняли свой SQL-текст.
Представление, объединяющее mx_query_execute_history и mx_querytext по queryid, позволяющее получать как исторические статистические данные, так и SQL-текст запросов.
mxstat не записывает каждый запрос индивидуально. Вместо этого он группирует похожие запросы в категории на основе их деревьев парсинга.
Например, следующие запросы все вставляют данные в таблицу test1 с разными параметрами. Они генерируют один и тот же queryid и объединяются в одну категорию:
INSERT INTO test1 VALUES(1);
INSERT INTO test1 VALUES(2);
INSERT INTO test1 VALUES(3);
Следующие запросы отличаются только значениями условий и также объединяются:
SELECT * FROM test1 WHERE c1 = 1;
SELECT * FROM test1 WHERE c1 = 2;
SELECT * FROM test1 WHERE c1 = 3;
Однако следующие запросы обращаются к разным таблицам и не объединяются:
SELECT * FROM test1 WHERE c1 = 1;
SELECT * FROM test2 WHERE c1 = 1;
SELECT * FROM test3 WHERE c1 = 1;
Выполните следующие три SQL-запроса:
SELECT pg_sleep(5);
SELECT pg_sleep(10);
SELECT pg_sleep(15);
Затем запросите статистику mxstat_execute:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%pg_sleep%';
seg | userid | dbid | queryid | nestlevel | query | calls_begin | calls_alive | calls_end | total_time | min_time
| max_time | mean_time | stddev_time | sample_planid | sample_start | sample_parse_done |
sample_plan_done | sample_exec_start | sample_exec_end
-----+--------+-------+----------------------+-----------+---------------------+-------------+-------------+-----------+------------+----------
+-----------+--------------------+-------------------+----------------------+-------------------------------+-------------------------------+--
-----------------------------+-------------------------------+-------------------------------
-1 | 10 | 16384 | -2007749946425010549 | 0 | select pg_sleep($1) | 3 | 0 | 3 | 30041 | 5009.054
| 15018.717 | 10013.666666666666 | 4086.427819588182 | -2693056513545111817 | 2022-03-25 13:58:58.503851-04 | 2022-03-25 13:58:58.503933-04 | 2
022-03-25 13:58:58.503994-04 | 2022-03-25 13:58:58.504008-04 | 2022-03-25 13:59:13.522725-04
(1 row)
Результат показывает, что запрос был выполнен три раза. Текст query нормализован: параметр времени заменен на $ + 参数序号. Общее, минимальное, максимальное и среднее время выполнения соответствуют ожиданиям. Временные метки для каждого этапа самого медленного выполнения (15-секундной паузы) зафиксированы.
Для проверки использования ресурсов объедините с mxstat_execute.queryid:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_usage WHERE queryid = -2007749946425010549;
seg | userid | dbid | queryid | nestlevel | rows | shared_blks_hit | shared_blks_read | shared_blks_dirtied | shared_blks_writte
n | local_blks_hit | local_blks_read | local_blks_dirtied | local_blks_written | temp_blks_read | temp_blks_written | blk_read_time | blk_write
_time | ru_utime | ru_stime | ru_maxrss | ru_ixrss | ru_idrss | ru_isrss | ru_minflt | ru_majflt | ru_nswap | ru_inblock | ru_oublock | ru_msgs
nd | ru_msgrcv | ru_nsignals | ru_nvcsw | ru_nivcsw
-----+--------+-------+----------------------+-----------+------+-----------------+------------------+---------------------+-------------------
--+----------------+-----------------+--------------------+--------------------+----------------+-------------------+---------------+----------
------+----------+----------+-----------+----------+----------+----------+-----------+-----------+----------+------------+------------+--------
---+-----------+-------------+----------+-----------
-1 | 10 | 16384 | -2007749946425010549 | 0 | 3 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0.001297 | 0.000431 | 20568 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 122 | 0
(1 row)
Результат показывает, что запрос выполнялся только на узле Master, поэтому существует только одна запись seg = -1.
Рассмотрим другой пример:
CREATE TABLE test1(c1 int, c2 int) DISTRIBUTED BY(c1);
Запросите mxstat_execute:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%create table test1%';
seg | userid | dbid | queryid | nestlevel | query | calls_begin | calls_alive |
calls_end | total_time | min_time | max_time | mean_time | stddev_time | sample_planid | sample_start | sample_parse_done | sa
mple_plan_done | sample_exec_start | sample_exec_end
-----+--------+-------+----------------------+-----------+-------------------------------------------------------+-------------+-------------+-
----------+------------+----------+----------+-----------+-------------+---------------+-------------------------------+-------------------+---
---------------+-------------------------------+-------------------------------
-1 | 10 | 16384 | -6276724884379903029 | 0 | create table test1(c1 int, c2 int) distributed by(c1) | 1 | 0 |
1 | 46.221 | 46.221 | 46.221 | 46.221 | 0 | 0 | 2022-03-25 14:08:51.754458-04 | |
| 2022-03-25 14:08:51.754735-04 | 2022-03-25 14:08:51.800956-04
(1 row)
Проверьте использование ресурсов:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_usage WHERE queryid = -6276724884379903029;
seg | userid | dbid | queryid | nestlevel | rows | shared_blks_hit | shared_blks_read | shared_blks_dirtied | shared_blks_writte
n | local_blks_hit | local_blks_read | local_blks_dirtied | local_blks_written | temp_blks_read | temp_blks_written | blk_read_time | blk_write
_time | ru_utime | ru_stime | ru_maxrss | ru_ixrss | ru_idrss | ru_isrss | ru_minflt | ru_majflt | ru_nswap | ru_inblock | ru_oublock | ru_msgs
nd | ru_msgrcv | ru_nsignals | ru_nvcsw | ru_nivcsw
-----+--------+-------+----------------------+-----------+------+-----------------+------------------+---------------------+-------------------
--+----------------+-----------------+--------------------+--------------------+----------------+-------------------+---------------+----------
------+----------+----------+-----------+----------+----------+----------+-----------+-----------+----------+------------+------------+--------
---+-----------+-------------+----------+-----------
-1 | 10 | 16384 | -6276724884379903029 | 0 | 0 | 295 | 59 | 21 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0.004053 | 0 | 22744 | 0 | 0 | 0 | 429 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 6 | 0
1 | 10 | 16384 | -6276724884379903029 | 0 | 0 | 261 | 82 | 19 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0.001691 | 0.001558 | 19284 | 0 | 0 | 0 | 510 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1
0 | 10 | 16384 | -6276724884379903029 | 0 | 0 | 314 | 34 | 19 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0.002537 | 0.000193 | 18508 | 0 | 0 | 0 | 574 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1
2 | 10 | 16384 | -6276724884379903029 | 0 | 0 | 261 | 82 | 19 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0.003043 | 2.9e-05 | 19292 | 0 | 0 | 0 | 514 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 2
(4 rows)
Результат показывает, что использование ресурсов зафиксировано на всех сегментах, поскольку создание таблицы происходит на каждом узле.
В предыдущих результатах значение nestlevel было 0, поскольку не было вложенных запросов. Следующий пример демонстрирует вложенное выполнение, обычно достигаемое через вызовы UDF.
CREATE OR REPLACE FUNCTION nest_query() RETURNS SETOF RECORD
AS $$ SELECT 1;$$
LANGUAGE SQL;
Это создает UDF с именем nest_query, выполняющую SQL: SELECT 1. Вызовите UDF:
Примечание: mxstat по умолчанию не отслеживает вложенные операторы. Установите
mxstat_statements.trackв'all'.mxadmin=# SET mxstat_statements.track TO 'all'; SET mxadmin=# select nest_query(); nest_query ------------ (1) (1 row)
Теперь запросите внутренний оператор SELECT 1. Поскольку 1 является константой, нормализованный запрос использует $1:
matrixmgr=# SELECT * FROM matrixmgr_internal.mxstat_execute WHERE query LIKE '%SELECT $1%';
seg | userid | dbid | queryid | nestlevel | query | calls_begin | calls_alive | calls_end | total_time | min_time | max_time
| mean_time | stddev_time | sample_planid | sample_start | sample_parse_done | sample_plan_done
| sample_exec_start | sample_exec_end
-----+--------+-------+----------------------+-----------+-----------+-------------+-------------+-----------+------------+----------+---------
-+-----------+-------------+---------------------+-------------------------------+-------------------------------+-----------------------------
--+-------------------------------+-------------------------------
-1 | 10 | 16384 | -4554727679305370053 | 1 | SELECT $1 | 1 | 0 | 1 | 0.031 | 0.031 | 0.031
| 0.031 | 0 | -382705668420232707 | 2022-03-25 14:35:30.668124-04 | 2022-03-25 14:35:30.668373-04 | 2022-03-25 14:35:30.668403-0
4 | 2022-03-25 14:35:30.668408-04 | 2022-03-25 14:35:30.668439-04
(1 row)
Значение nestlevel теперь равно 1, что указывает на глубину вложенности 1. Более глубокая вложенность увеличивает это значение. mxstat поддерживает до 31 уровня вложенности.
mxstat предоставляет следующие GUC-параметры для управления поведением мониторинга:
| Имя | Тип | Описание |
|---|---|---|
| mxstat_statements.max | Integer | Количество хеш-слотов для хранения информации о времени выполнения запросов. По умолчанию 5000 |
| mxstat_statements.usage_multiple | Integer | Множитель количества хеш-слотов, используемых для хранения информации о потреблении ресурсов запросов, относительно слотов времени выполнения. Более высокое значение гарантирует, что каждый запрос сможет найти соответствующую запись о потреблении ресурсов. По умолчанию 2 |
| mxstat_statements.track | String | Управляет уровнем отслеживания операторов: top: Отслеживать только верхнеуровневые операторы, без отслеживания вложенных (по умолчанию). all: Отслеживать все операторы, включая вложенные. none: Отключить отслеживание, фактически отключив функцию |
| mxstat_statements.track_utility | Boolean | Отслеживать ли выполнение утилитарных команд. По умолчанию true |
| mxstat_statements.save | Boolean | Сохранять ли статистику из памяти на диск при перезапуске кластера. По умолчанию true |
| mxstat_statements.harvest_interval | Integer | Интервал (в минутах), через который статистика запросов извлекается из общей памяти в исторические таблицы. По умолчанию 5 минут |
| mxstat_statements.harvest_usage | Boolean | Собирать ли информацию о потреблении ресурсов. По умолчанию true |
| mxstat_statements.ignored_databases | String | Список баз данных, которые следует игнорировать, разделенный запятыми. По умолчанию template0,template1,matrixmgr |
Примечание!
Остановка функции статистики запросов не требует остановки или перезапуска базы данных.
Сначала остановите фоновый рабочий процесс на Master:
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_stop_worker();"
Затем отключите отслеживание на уровне всего кластера и перезагрузите конфигурацию:
$ gpconfig -s mxstat_statements.track
$ gpconfig -c mxstat_statements.track -v none
$ mxstop -u
Наконец, очистите собранные данные:
psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_reset();"
Чтобы снова запустить фоновый рабочий процесс, выполните:
$ psql -d matrixmgr -c "SELECT matrixmgr_internal.mxstat_start_worker();"