2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.25. pg_buffercache — 檢視 PostgreSQL 緩衝區快取狀態 #

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() 函式允許給定關係識別符號的所有未鎖定(unpinned)的共享緩衝區從緩衝區池中驅逐出去。此函式的使用僅限於超級使用者。

pg_buffercache_evict_all() 函式允許將緩衝區池中的所有未鎖定(unpinned)的共享緩衝區驅逐出去。此函式的使用僅限於超級使用者。

F.25.1. The pg_buffercache View #

檢視公開的列的定義顯示在 表 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 之外的所有欄位都為 NULL。共享系統目錄顯示為屬於資料庫零。

由於快取被所有資料庫共享,因此通常會有來自不屬於當前資料庫的關係的頁面。這意味著 pg_class 中可能沒有匹配的連線行,或者甚至可能存在不正確的連線。如果您嘗試連線到 pg_class,最好將連線限制為 reldatabase 等於當前資料庫 OID 或零的行。

由於在複製檢視將要顯示的緩衝區狀態資料時不會獲取緩衝區管理器鎖,因此訪問 pg_buffercache 檢視對正常的緩衝區活動影響較小,但它無法為所有緩衝區提供一致的結果集。但是,我們確保每個緩衝區的資訊都是自洽的。

F.25.2. The pg_buffercache_numa View #

檢視公開的列的定義顯示在 表 F.15 中。

表 F.15. pg_buffercache_numa

列 型別

描述

bufferid integer

ID,範圍為 1..shared_buffers

os_page_num bigint

此緩衝區的作業系統記憶體頁數

numa_node int

ID ofNUMA節點


作為NUMA節點 ID 查詢每個頁面需要將記憶體頁面分頁,第一次執行此函式可能需要明顯的時間。在所有情況下(第一次執行或不是),檢索此資訊都非常昂貴,因此不建議頻繁查詢此檢視。

警告

在確定NUMA節點時,檢視會觸及共享記憶體段的所有記憶體頁。這將強制分配共享記憶體(如果尚未分配),並且記憶體可能會分配在單個NUMA節點上(取決於系統配置)。

F.25.3. The pg_buffercache_summary() Function #

函式公開的列的定義顯示在 表 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.25.4. The pg_buffercache_usage_counts() Function #

函式公開的列的定義顯示在 表 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.25.5. The pg_buffercache_evict() Function #

pg_buffercache_evict() 函式接受一個緩衝區識別符號,如 pg_buffercache 檢視的 bufferid 列所示。它返回有關緩衝區是否被驅逐和重新整理(flushed)的資訊。如果緩衝區無效、由於被鎖定而無法驅逐,或者在嘗試寫出後又變髒,則 列為 true。這並不一定意味著緩衝區是由我們重新整理的,它可能由其他人重新整理。由於併發活動,緩衝區可能隨時再次變有效,因此結果在返回後立即過時。該函式僅用於開發人員測試。

F.25.6. The pg_buffercache_evict_relation() Function #

pg_buffercache_evict_relation() 函式與 pg_buffercache_evict() 函式非常相似。區別在於 pg_buffercache_evict_relation() 接受一個關係識別符號而不是緩衝區識別符號。它會嘗試驅逐該關係所有分叉(forks)的所有緩衝區。它返回被驅逐的緩衝區數量、被重新整理的緩衝區數量以及無法被驅逐的緩衝區數量。被重新整理的緩衝區不一定是由我們重新整理的,它們可能由其他人重新整理。由於併發活動,緩衝區可能立即被重新讀入,因此結果在返回後立即過時。該函式僅用於開發人員測試。

F.25.7. The pg_buffercache_evict_all() Function #

pg_buffercache_evict_all() 函式與 pg_buffercache_evict() 函式非常相似。區別在於,pg_buffercache_evict_all() 函式不接受引數;而是嘗試驅逐緩衝區池中的所有緩衝區。它返回被驅逐的緩衝區數量、被重新整理的緩衝區數量以及無法被驅逐的緩衝區數量。被重新整理的緩衝區不一定是由我們重新整理的,它們可能由其他人重新整理。由於併發活動,緩衝區可能立即被重新讀入,因此結果在返回後立即過時。該函式僅用於開發人員測試。

F.25.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.25.9. 作者 #

Mark Kirkwood

設計建議:Neil Conway

除錯建議:Tom Lane

提交更正

如果您在文件中看到任何不正確、與您在該特定功能上的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。