F.41. pg_buffercache — инспектировать состояние кеша буферов Tantor SE#

F.41. pg_buffercache — инспектировать состояние кеша буферов Tantor SE

F.41. pg_buffercache — инспектировать состояние кеша буферов Tantor SE #

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

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

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

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

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

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

Функция pg_buffercache_evict() позволяет удалить блок из пула буферов, используя идентификатор буфера. Использование этой функции ограничено только суперпользователями.

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

Все определения столбцов, предоставляемых представлением, показаны в Таблица F.14.

Таблица F.14. pg_buffercache Колонки

Тип столбца

Описание

bufferid integer

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

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

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

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

OID табличного пространства имен отношения

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

OID базы данных отношения

relforknumber smallint

Номер форка внутри отношения; см. common/relpath.h

relblocknumber bigint

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

isdirty boolean

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

usagecount smallint

Число доступов при очистке часов

pinning_backends integer

Количество бэкендов, закрепляющих этот буфер


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

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

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

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

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

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

Тип столбца

Описание

buffers_used int4

Количество используемых разделяемых буферов

buffers_unused int4

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

buffers_dirty int4

Количество грязных общих буферов

buffers_pinned int4

Количество закрепленных общих буферов

usagecount_avg float8

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


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

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

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

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

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

Тип столбца

Описание

usage_count int4

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

buffers int4

Количество буферов с числом использований

dirty int4

Количество грязных буферов с числом использований

pinned int4

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


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

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

F.41.4. Функция pg_buffercache_evict() #

Функция pg_buffercache_evict() принимает идентификатор буфера, как показано в столбце bufferid представления pg_buffercache. Она возвращает true в случае успеха и false, если буфер был недействителен, если его не удалось выселить, потому что он был закреплен, или если он снова стал грязным после попытки его записи. Результат сразу же устаревает после возврата, так как буфер может снова стать действительным в любое время из-за параллельной активности. Функция предназначена только для тестирования разработчиками.

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

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.41.6. Авторы #

Mark Kirkwood

Советы по проектированию: Нил Конвей (Neil Conway)

Советы по отладке: Tom Lane