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

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

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

Модуль 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.32.1. Представление pg_buffercache #

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

Таблица F.15. 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.32.2. Функция pg_buffercache_summary() #

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

Таблица F.16. 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.32.3. Функция pg_buffercache_usage_counts() #

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

Таблица F.17. 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.32.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.32.5. Авторы #

Mark Kirkwood

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

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