mirror of https://github.com/postgres/postgres
Introduces a new view pg_buffercache_numa, showing NUMA memory nodes for individual buffers. For each buffer the view returns an entry for each memory page, with the associated NUMA node. The database blocks and OS memory pages may have different size - the default block size is 8KB, while the memory page is 4K (on x86). But other combinations are possible, depending on configure parameters, platform, etc. This means buffers may overlap with multiple memory pages, each associated with a different NUMA node. To determine the NUMA node for a buffer, we first need to touch the memory pages using pg_numa_touch_mem_if_required, otherwise we might get status -2 (ENOENT = The page is not present), indicating the page is either unmapped or unallocated. The view may be relatively expensive, especially when accessed for the first time in a backend, as it touches all memory pages to get reliable information about the NUMA node. This may also force allocation of the shared memory. Author: Jakub Wartak <jakub.wartak@enterprisedb.com> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com> Reviewed-by: Tomas Vondra <tomas@vondra.me> Discussion: https://postgr.es/m/CAKZiRmxh6KWo0aqRqvmcoaX2jUxZYb4kGp3N%3Dq1w%2BDiH-696Xw%40mail.gmail.compull/210/head
parent
8cc139bec3
commit
ba2a3c2302
@ -0,0 +1,29 @@ |
||||
SELECT NOT(pg_numa_available()) AS skip_test \gset |
||||
\if :skip_test |
||||
\quit |
||||
\endif |
||||
-- We expect at least one entry for each buffer |
||||
select count(*) >= (select setting::bigint |
||||
from pg_settings |
||||
where name = 'shared_buffers') |
||||
from pg_buffercache_numa; |
||||
?column? |
||||
---------- |
||||
t |
||||
(1 row) |
||||
|
||||
-- Check that the functions / views can't be accessed by default. To avoid |
||||
-- having to create a dedicated user, use the pg_database_owner pseudo-role. |
||||
SET ROLE pg_database_owner; |
||||
SELECT count(*) > 0 FROM pg_buffercache_numa; |
||||
ERROR: permission denied for view pg_buffercache_numa |
||||
RESET role; |
||||
-- Check that pg_monitor is allowed to query view / function |
||||
SET ROLE pg_monitor; |
||||
SELECT count(*) > 0 FROM pg_buffercache_numa; |
||||
?column? |
||||
---------- |
||||
t |
||||
(1 row) |
||||
|
||||
RESET role; |
@ -0,0 +1,3 @@ |
||||
SELECT NOT(pg_numa_available()) AS skip_test \gset |
||||
\if :skip_test |
||||
\quit |
@ -0,0 +1,22 @@ |
||||
/* contrib/pg_buffercache/pg_buffercache--1.5--1.6.sql */ |
||||
|
||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION |
||||
\echo Use "ALTER EXTENSION pg_buffercache UPDATE TO '1.6'" to load this file. \quit |
||||
|
||||
-- Register the new functions. |
||||
CREATE OR REPLACE FUNCTION pg_buffercache_numa_pages() |
||||
RETURNS SETOF RECORD |
||||
AS 'MODULE_PATHNAME', 'pg_buffercache_numa_pages' |
||||
LANGUAGE C PARALLEL SAFE; |
||||
|
||||
-- Create a view for convenient access. |
||||
CREATE VIEW pg_buffercache_numa AS |
||||
SELECT P.* FROM pg_buffercache_numa_pages() AS P |
||||
(bufferid integer, os_page_num int4, numa_node int4); |
||||
|
||||
-- Don't want these to be available to public. |
||||
REVOKE ALL ON FUNCTION pg_buffercache_numa_pages() FROM PUBLIC; |
||||
REVOKE ALL ON pg_buffercache_numa FROM PUBLIC; |
||||
|
||||
GRANT EXECUTE ON FUNCTION pg_buffercache_numa_pages() TO pg_monitor; |
||||
GRANT SELECT ON pg_buffercache_numa TO pg_monitor; |
@ -1,5 +1,5 @@ |
||||
# pg_buffercache extension |
||||
comment = 'examine the shared buffer cache' |
||||
default_version = '1.5' |
||||
default_version = '1.6' |
||||
module_pathname = '$libdir/pg_buffercache' |
||||
relocatable = true |
||||
|
@ -0,0 +1,21 @@ |
||||
SELECT NOT(pg_numa_available()) AS skip_test \gset |
||||
\if :skip_test |
||||
\quit |
||||
\endif |
||||
|
||||
-- We expect at least one entry for each buffer |
||||
select count(*) >= (select setting::bigint |
||||
from pg_settings |
||||
where name = 'shared_buffers') |
||||
from pg_buffercache_numa; |
||||
|
||||
-- Check that the functions / views can't be accessed by default. To avoid |
||||
-- having to create a dedicated user, use the pg_database_owner pseudo-role. |
||||
SET ROLE pg_database_owner; |
||||
SELECT count(*) > 0 FROM pg_buffercache_numa; |
||||
RESET role; |
||||
|
||||
-- Check that pg_monitor is allowed to query view / function |
||||
SET ROLE pg_monitor; |
||||
SELECT count(*) > 0 FROM pg_buffercache_numa; |
||||
RESET role; |
Loading…
Reference in new issue