Статистика запросов

Документ описывает развертывание, структуру таблиц, использование, настройку и отключение функции статистики запросов YMatrix.

Модуль статистики запросов mxstat собирает информацию о выполнении запросов, включая:

  • Время выполнения запроса
  • Потребление ресурсов запросом

1 Развертывание

Модуль включен в расширение 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

2 Структура таблиц

После успешного развертывания в схеме matrixmgr_internal базы данных matrixmgr появляются следующие таблицы и представления:

  • mx_query_execute_history
  • mx_query_execute_history_with_text
  • mx_query_usage_history
  • mx_querytext
  • mxstat_execute
  • mxstat_usage

2.1 mxstat_execute

Представление информации о выполнении запросов.

Это представление отображает статистику по запросам, выполненным с момента последнего сбора истории (интервал по умолчанию: 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 Время завершения выполнения самого медленного запроса

2.2 mxstat_usage

Представление информации о потреблении ресурсов запросами.

Это представление отображает статистику использования ресурсов для запросов, выполненных с момента последнего сбора истории (интервал по умолчанию: 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 Количество принудительных переключений контекста (истек квант времени или процесс был прерван)

2.3 mx_query_execute_history

Это партиционированная таблица, хранящая исторические данные из представления mxstat_execute, собираемые по умолчанию каждые 5 минут. Ее структура соответствует mxstat_execute, с дополнительным столбцом ts_bucket, указывающим время сбора.

2.4 mx_query_usage_history

Это партиционированная таблица, хранящая исторические данные из представления mxstat_usage, собираемые по умолчанию каждые 5 минут. Ее структура соответствует mxstat_usage, с дополнительным столбцом ts_bucket, указывающим время сбора.

2.5 mx_querytext

Хранит соответствие между queryid и querytext. Как и другие исторические таблицы, она периодически сохраняет данные, чтобы исторические запросы сохраняли свой SQL-текст.

2.6 mx_query_execute_history_with_text

Представление, объединяющее mx_query_execute_history и mx_querytext по queryid, позволяющее получать как исторические статистические данные, так и SQL-текст запросов.

3 Использование

3.1 Категоризация запросов

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;

3.2 Примеры

Пример 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) 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)

Результат показывает, что использование ресурсов зафиксировано на всех сегментах, поскольку создание таблицы происходит на каждом узле.

Пример 3

В предыдущих результатах значение 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 уровня вложенности.

4 Настройка

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

5 Остановка

Примечание!
Остановка функции статистики запросов не требует остановки или перезапуска базы данных.

Сначала остановите фоновый рабочий процесс на 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();"