Добавил:
ИВТ (советую зайти в "Несортированное")rnПИН МАГА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Database 2024 / Books / Мониторинг PostgreSQL.pdf
Скачиваний:
26
Добавлен:
20.11.2024
Размер:
6.87 Mб
Скачать

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. В тестовом окружении под этим пользователем подключается экспортер метрик для снятия статистики. Для экспортера, да и для любого другого агента мониторинга, такое количество соединений слишком велико,что является поводом для оптимизации кода.

Соседние файлы в папке Books