F.37. pg_buffercache — информация о состоянии буферного кеша Postgres Pro#

Модуль pg_buffercache даёт возможность понять, что происходит в общем кеше буферов в реальном времени.

Этот модуль предоставляет функцию pg_buffercache_pages() (обёрнута в представление pg_buffercache), а также функции pg_buffercache_summary() и pg_buffercache_usage_counts().

Функция pg_buffercache_pages() возвращает набор записей, каждая строка которого описывает состояние одного буфера в общем кеше. Для удобства пользования обёрткой функции является представление pg_buffercache.

Функция pg_buffercache_summary() возвращает одну строку со сводной информацией о состоянии общего кеша буферов.

Функция pg_buffercache_usage_counts() возвращает набор записей, в каждой строке которого указано количество буферов в разбивке по счётчику использования.

По умолчанию его использование разрешено только суперпользователям и ролям с правами роли pg_monitor. Дать доступ другим ролям можно с помощью GRANT.

F.37.1. Представление pg_buffercache#

Определения столбцов, содержащихся в представлении, показаны в Таблице F.20.

Таблица F.20. Столбцы pg_buffercache

Тип столбца

Описание

bufferidinteger

ID, в диапазоне 1..shared_buffers

relfilenodeoid (ссылается на pg_class.relfilenode)

Номер файлового узла для отношения

reltablespaceoid (ссылается на pg_tablespace.oid)

OID табличного пространства, содержащего отношение

reldatabaseoid (ссылается на pg_database.oid)

OID базы данных, содержащей отношение

relforknumbersmallint

Номер слоя в отношении

relblocknumberbigint

Номер страницы в отношении

isdirtyboolean

Страница загрязнена?

usagecountsmallint

Счётчик обращений по часовой стрелке

pinning_backendsinteger

Число обслуживающих процессов, закрепивших этот буфер


Для каждого буфера в общем кеше выдаётся одна строка. Для неиспользуемых буферов все поля равны NULL, за исключением bufferid. Общие системные каталоги показываются как относящиеся к базе данных под номером 0.

Так как кеш используется совместно всеми базами данных, обычно в нём находятся и страницы из отношений, не принадлежащих текущей базе данных. Это означает, что для некоторых строк при соединении с pg_class не найдутся соответствующие строки, либо соединение будет некорректным. Если вы хотите выполнить соединение с pg_class, будет правильным ограничить соединение строками, в которых reldatabase содержит OID текущей базы данных или ноль.

Для копирования данных состояния, которые будут отображаться, блокировки в менеджере буферов не устанавливаются. Поэтому обращения к представлению pg_buffercache меньше сказываются на обычной активности буферов, но набор результатов, полученный для всех буферов, в целом может оказаться несогласованным. Однако внутри каждого отдельного буфера согласованность информации гарантируется.

F.37.2. Функция pg_buffercache_summary()#

Определения столбцов, возвращаемых функцией, показаны в Таблице F.21.

Таблица F.21. Выходные столбцы pg_buffercache_summary()

Тип столбца

Описание

buffers_usedint4

Число используемых общих буферов

buffers_unusedint4

Число неиспользуемых общих буферов

buffers_dirtyint4

Число загрязнённых общих буферов

buffers_pinnedint4

Число закреплённых общих буферов

usagecount_avgfloat8

Среднее значение счётчика использования общих буферов


Функция pg_buffercache_summary() возвращает одну строку со сводной информацией о состоянии всех общих буферов. Подобную и более подробную информацию можно получить из представления pg_buffercache, но pg_buffercache_summary() обходится существенно дешевле.

Как и представление pg_buffercache, pg_buffercache_summary() не получает блокировки менеджера буферов, поэтому при параллельной работе в базе данных допустима незначительная погрешность результатов функции.

F.37.3. Функция pg_buffercache_usage_counts()#

Определения столбцов, возвращаемых функцией, показаны в Таблице F.22.

Таблица F.22. Выходные столбцы pg_buffercache_usage_counts()

Тип столбца

Описание

usage_countint4

Возможное значение счётчика использования буферов

buffersint4

Число буферов в разбивке по счётчику использования

dirtyint4

Число загрязнённых буферов в разбивке по счётчику использования

pinnedint4

Число закреплённых буферов в разбивке по счётчику использования


Функция pg_buffercache_usage_counts() возвращает набор строк со сводной информацией о состоянии всех общих буферов, агрегированных по возможным значениям счётчика использования. Подобную и более подробную информацию можно получить с помощью представления pg_buffercache, но pg_buffercache_usage_counts() обходится существенно дешевле.

Как и представление pg_buffercache, pg_buffercache_usage_counts() не получает блокировки менеджера буферов, поэтому при параллельной работе в базе данных допустима незначительная погрешность результатов функции.

F.37.4. Пример вывода #

regression=# SELECT n.nspname, c.relname, count(*) AS buffers FROM pg_buffercache b JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) JOIN pg_namespace n ON n.oid = c.relnamespace GROUP BY n.nspname, c.relname ORDER BY 3 DESC LIMIT 10; nspname | relname | buffers ------------+------------------------+--------- public | delete_test_table | 593 public | delete_test_table_pkey | 494 pg_catalog | pg_attribute | 472 public | quad_poly_tbl | 353 public | tenk2 | 349 public | tenk1 | 349 public | gin_test_idx | 306 pg_catalog | pg_largeobject | 206 public | gin_test_tbl | 188 public | spgist_text_tbl | 182 (10 rows) regression=# SELECT * FROM pg_buffercache_summary(); buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg --------------+----------------+---------------+----------------+---------------- 248 | 2096904 | 39 | 0 | 3.141129 (1 row) regression=# SELECT * FROM pg_buffercache_usage_counts(); usage_count | buffers | dirty | pinned -------------+---------+-------+-------- 0 | 14650 | 0 | 0 1 | 1436 | 671 | 0 2 | 102 | 88 | 0 3 | 23 | 21 | 0 4 | 9 | 7 | 0 5 | 164 | 106 | 0 (6 rows)

F.37.5. Авторы #

Марк Кирквуд

Предложения по конструкции: Нейл Конвей

Советы по отладке: Том Лейн

close