F.30. pg_buffercache — инспектировать состояние кеша буферов Tantor BE#
F.30. pg_buffercache — инспектировать состояние кеша буферов Tantor BE #
- F.30.1. Представление
pg_buffercache - F.30.2. Представление
pg_buffercache_numa - F.30.3. Функция
pg_buffercache_summary() - F.30.4. Функция
pg_buffercache_usage_counts() - F.30.5. Функция
pg_buffercache_evict() - F.30.6. Функция
pg_buffercache_evict_relation() - F.30.7. Функция
pg_buffercache_evict_all() - F.30.8. Пример вывода
- F.30.9. Авторы
Модуль pg_buffercache предоставляет средство для
изучения того, что происходит в общем буферном кеше в реальном времени.
Он также предлагает низкоуровневый способ удаления данных из него для тестирования.
Этот модуль предоставляет функцию pg_buffercache_pages()
(обернутую в представление pg_buffercache),
функцию pg_buffercache_numa_pages() (обернутую в
представление pg_buffercache_numa),
функцию pg_buffercache_summary(),
функцию pg_buffercache_usage_counts(),
функцию pg_buffercache_evict(),
функцию pg_buffercache_evict_relation() и
функцию pg_buffercache_evict_all().
Функция pg_buffercache_pages() возвращает набор записей, каждая строка описывает состояние одной записи общего буфера. Представление pg_buffercache оборачивает функцию для удобного использования.
Функция pg_buffercache_numa_pages() предоставляет сопоставления узлов NUMA для записей в общем буфере. Эта информация не выводится функцией pg_buffercache_pages() без обертки, так как она извлекается значительно медленнее. Представление pg_buffercache_numa оборачивает эту функцию для удобства использования.
Функция pg_buffercache_summary() возвращает одну строку, суммирующую состояние общего буферного кеша.
Функция pg_buffercache_usage_counts() возвращает набор
записей, каждая строка описывает количество буферов с заданным числом
использования.
По умолчанию использование вышеуказанных функций ограничено суперпользователями и ролями
с привилегиями роли pg_monitor. Доступ может быть
предоставлен другим с помощью GRANT.
Функция pg_buffercache_evict() позволяет удалить блок из пула буферов, используя идентификатор буфера. Использование этой функции ограничено только суперпользователями.
Функция pg_buffercache_evict_relation() позволяет вытеснять из пула буферов все незафиксированные общие буферы в отношении с указанным идентификатором отношения. Использование этой функции разрешено только суперпользователям.
Функция pg_buffercache_evict_all() позволяет вытеснить из пула буферов все незафиксированные общие буферы. Использование этой функции разрешено только суперпользователям.
F.30.1. Представление pg_buffercache #
Все определения столбцов, предоставляемых представлением, показаны в Таблица F.14.
Таблица F.14. pg_buffercache Колонки
Тип столбца Описание |
|---|
ID, в диапазоне 1.. |
Номер файла узла отношения |
OID табличного пространства имен отношения |
OID базы данных отношения |
Номер форка внутри отношения; см.
|
Номер страницы в отношении |
Страница грязная? |
Число доступов при очистке часов |
Количество бэкендов, закрепляющих этот буфер |
Вся информация о буферах в общем кеше представлена в виде одной строки для каждого буфера. Неиспользуемые буферы отображаются с пустыми значениями для всех полей, кроме bufferid. Общие системные каталоги отображаются как принадлежащие к базе данных с номером ноль.
Поскольку кеш используется всеми базами данных, обычно в нем будут
страницы отношений, не принадлежащих текущей базе данных. Это означает,
что для некоторых строк может не быть соответствующих строк соединения в pg_class, или даже могут быть неправильные соединения. Если вы
пытаетесь объединить с pg_class, хорошей идеей будет
ограничить соединение строками, у которых reldatabase равно
OID текущей базы данных или нулю.
Так как блокировки менеджера буферов не применяются для копирования данных состояния буфера, которые будут отображаться в представлении pg_buffercache, доступ к этому представлению оказывает меньшее влияние на нормальную активность буфера, но не обеспечивает последовательный набор результатов для всех буферов. Однако мы гарантируем, что информация о каждом буфере является самосогласованной.
F.30.2. Представление pg_buffercache_numa #
Определения столбцов, отображаемых этим представлением, показаны в Таблица F.15.
Таблица F.15. Столбцы pg_buffercache_numa
Тип столбца Описание |
|---|
ID, в диапазоне 1.. |
номер страницы памяти ОС для этого буфера |
ID узла NUMA |
Поскольку запрос идентификатора узла NUMA для каждой страницы требует выгрузки страниц памяти, первое выполнение этой функции может занять большое количество времени. В любом случае (идет ли первое выполнение или повторное) получение этой информации является затратной операцией, и частое обращение к этому представлению не рекомендуется.
Предупреждение
При определении NUMA узла представление обращается ко всем страницам сегмента общей памяти. Это приведет к выделению общей памяти, если она еще не была выделена, и память может быть выделена на одном узле NUMA (в зависимости от конфигурации системы).
F.30.3. Функция pg_buffercache_summary() #
Определения столбцов, отображаемых функцией, показаны в Таблица F.16.
Таблица F.16. pg_buffercache_summary() Выходные столбцы
Тип столбца Описание |
|---|
Количество используемых разделяемых буферов |
Количество неиспользуемых общих буферов |
Количество грязных общих буферов |
Количество закрепленных общих буферов |
Среднее количество использований используемых общих буферов |
Функция pg_buffercache_summary() возвращает
одну строку, суммирующую состояние всех общих буферов. Аналогичная и более
детализированная информация предоставляется представлением
pg_buffercache, но
pg_buffercache_summary() значительно дешевле.
Как и представление pg_buffercache,
pg_buffercache_summary() не захватывает блокировки
менеджера буферов. Поэтому параллельная активность может привести к незначительным неточностям
в результате.
F.30.4. Функция pg_buffercache_usage_counts() #
Определения столбцов, отображаемых функцией, показаны в Таблица F.17.
Таблица F.17. pg_buffercache_usage_counts() Выходные столбцы
Тип столбца Описание |
|---|
Возможное количество использования буфера |
Количество буферов с числом использований |
Количество грязных буферов с числом использований |
Количество закрепленных буферов с числом использования |
Функция pg_buffercache_usage_counts() возвращает
набор строк, суммирующих состояния всех общих буферов, агрегированных по
возможным значениям счетчика использования. Похожая и более детальная информация
предоставляется представлением pg_buffercache, но
pg_buffercache_usage_counts() значительно дешевле.
Как и представление pg_buffercache,
pg_buffercache_usage_counts() не захватывает блокировки
менеджера буферов. Поэтому параллельная активность может привести к незначительным
неточностям в результате.
F.30.5. Функция pg_buffercache_evict() #
Функция pg_buffercache_evict() принимает идентификатор буфера, который отображается в столбце bufferid представления pg_buffercache. Она возвращает информацию о том, был ли буфер вытеснен и сброшен. Столбец buffer_evicted принимает значение true если буфер был вытеснен, и false, если буфер был недействителен, если его нельзя было вытеснить, т.к. был закреплен, или если он снова стал грязным после попытки записи. Столбец buffer_flushed принимает значение true, если буфер был сброшен. Это не обязательно означает, что буфер был сброшен вами, он мог быть сброшен любым пользователем. Результат сразу же устаревает после возврата, так как буфер может снова стать действительным в любой момент вследствие выполнения параллельных операций. Функция предназначена только для тестирования.
F.30.6. Функция pg_buffercache_evict_relation() #
Функция pg_buffercache_evict_relation() очень похожа на функцию pg_buffercache_evict(). Разница заключается в том, что pg_buffercache_evict_relation() принимает идентификатор отношения вместо идентификатора буфера. Она пытается вытеснить все буферы для всех форков в этом отношении.
Функция возвращает количество вытесненных буферов, сброшенных буферов и количество буферов, которые не удалось вытеснить. Сброшенные буферы не обязательно были сброшены вами, они могли быть сброшены любым пользователем. Результат сразу же устаревает после возврата, так как буфер может снова стать действительным в любой момент вследствие выполнения параллельных операций. Функция предназначена только для тестирования.
F.30.7. Функция pg_buffercache_evict_all() #
Функция pg_buffercache_evict_relation() очень похожа на функцию pg_buffercache_evict(). Разница заключается в том, что pg_buffercache_evict_all() не принимает аргументы. Она пытается вытеснить все буферы из пула буферов.
Функция возвращает количество вытесненных буферов, сброшенных буферов и количество буферов, которые не удалось вытеснить. Сброшенные буферы не обязательно были сброшены вами, они могли быть сброшены любым пользователем. Результат сразу же устаревает после возврата, так как буфер может снова стать действительным в любой момент вследствие выполнения параллельных операций. Функция предназначена только для тестирования.
F.30.8. Пример вывода #
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.30.9. Авторы #
Mark Kirkwood <markir@paradise.net.nz>
Советы по проектированию: Нил Конвей (Neil Conway) <neilc@samurai.com>
Советы по отладке: Tom Lane <tgl@sss.pgh.pa.us>