Документ описывает развертывание, структуру таблиц, использование, настройку и отключение функции статистики запросов YMatrix.
Модуль статистики запросов mxstat собирает информацию о выполненных запросах, включая:
Модуль включен в расширение matrixmgr и устанавливается по умолчанию вместе с системой.
$ 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;
Пример 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.
Пример 2
Рассмотрим другой пример:
=# CREATE TABLE test1(
c1 int,
c2 int
)
USING MARS3
DISTRIBUTED BY(c1)
ORDER 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)
Результат показывает, что запрос создал таблицу на каждом узле, поэтому использование ресурсов фиксируется на всех сегментах.
Пример 3
В приведенных выше результатах значения nestlevel в mxstat_execute равны 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 | Статистика по умолчанию хранится в разделяемой памяти и периодически сохраняется в исторические таблицы. Этот параметр GUC задает интервал сбора в минутах. По умолчанию 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();"