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)的共享緩衝區驅逐出去。此函式的使用僅限於超級使用者。
pg_buffercache View #檢視公開的列的定義顯示在 表 F.14 中。
表 F.14. pg_buffercache 列
|
列 型別 描述 |
|---|
|
ID,範圍為 1.. |
|
關係的檔案節點號 |
|
關係的表空間 OID |
|
關係的資料庫 OID |
|
關係內的分叉號;參見 |
|
關係內的頁面號 |
|
頁面是否髒? |
|
時鐘掃描訪問計數 |
|
固定此緩衝區的後端數量 |
共享快取中的每個緩衝區都有一行。未使用的緩衝區顯示除 bufferid 之外的所有欄位都為 NULL。共享系統目錄顯示為屬於資料庫零。
由於快取被所有資料庫共享,因此通常會有來自不屬於當前資料庫的關係的頁面。這意味著 pg_class 中可能沒有匹配的連線行,或者甚至可能存在不正確的連線。如果您嘗試連線到 pg_class,最好將連線限制為 reldatabase 等於當前資料庫 OID 或零的行。
由於在複製檢視將要顯示的緩衝區狀態資料時不會獲取緩衝區管理器鎖,因此訪問 pg_buffercache 檢視對正常的緩衝區活動影響較小,但它無法為所有緩衝區提供一致的結果集。但是,我們確保每個緩衝區的資訊都是自洽的。
pg_buffercache_numa View #檢視公開的列的定義顯示在 表 F.15 中。
表 F.15. pg_buffercache_numa 列
|
列 型別 描述 |
|---|
|
ID,範圍為 1.. |
|
此緩衝區的作業系統記憶體頁數 |
|
ID ofNUMA節點 |
作為NUMA節點 ID 查詢每個頁面需要將記憶體頁面分頁,第一次執行此函式可能需要明顯的時間。在所有情況下(第一次執行或不是),檢索此資訊都非常昂貴,因此不建議頻繁查詢此檢視。
在確定NUMA節點時,檢視會觸及共享記憶體段的所有記憶體頁。這將強制分配共享記憶體(如果尚未分配),並且記憶體可能會分配在單個NUMA節點上(取決於系統配置)。
pg_buffercache_summary() Function #函式公開的列的定義顯示在 表 F.16 中。
表 F.16. pg_buffercache_summary() 輸出列
|
列 型別 描述 |
|---|
|
使用的共享緩衝區數量 |
|
未使用的共享緩衝區數量 |
|
髒共享緩衝區數量 |
|
鎖定的共享緩衝區數量 |
|
已用共享緩衝區的平均使用計數 |
pg_buffercache_summary() 函式返回一個單行,總結了所有共享緩衝區狀態。 pg_buffercache 檢視提供了相似且更詳細的資訊,但 pg_buffercache_summary() 的開銷要小得多。
與 pg_buffercache 檢視一樣,pg_buffercache_summary() 不會獲取緩衝區管理器鎖。因此,併發活動可能導致結果存在細微的錯誤。
pg_buffercache_usage_counts() Function #函式公開的列的定義顯示在 表 F.17 中。
表 F.17. pg_buffercache_usage_counts() 輸出列
|
列 型別 描述 |
|---|
|
可能的緩衝區使用計數 |
|
具有該使用計數的緩衝區數量 |
|
具有該使用計數的髒緩衝區數量 |
|
具有該使用計數的鎖定緩衝區數量 |
pg_buffercache_usage_counts() 函式返回一組行,總結了所有共享緩衝區的狀態,並按可能的使用計數進行彙總。pg_buffercache 檢視提供了相似且更詳細的資訊,但 pg_buffercache_usage_counts() 的開銷要小得多。
與 pg_buffercache 檢視一樣,pg_buffercache_usage_counts() 不會獲取緩衝區管理器鎖。因此,併發活動可能導致結果存在細微的錯誤。
pg_buffercache_evict() Function #pg_buffercache_evict() 函式接受一個緩衝區識別符號,如 pg_buffercache 檢視的 bufferid 列所示。它返回有關緩衝區是否被驅逐和重新整理(flushed)的資訊。如果緩衝區無效、由於被鎖定而無法驅逐,或者在嘗試寫出後又變髒,則 列為 true。這並不一定意味著緩衝區是由我們重新整理的,它可能由其他人重新整理。由於併發活動,緩衝區可能隨時再次變有效,因此結果在返回後立即過時。該函式僅用於開發人員測試。
pg_buffercache_evict_relation() Function #pg_buffercache_evict_relation() 函式與 pg_buffercache_evict() 函式非常相似。區別在於 pg_buffercache_evict_relation() 接受一個關係識別符號而不是緩衝區識別符號。它會嘗試驅逐該關係所有分叉(forks)的所有緩衝區。它返回被驅逐的緩衝區數量、被重新整理的緩衝區數量以及無法被驅逐的緩衝區數量。被重新整理的緩衝區不一定是由我們重新整理的,它們可能由其他人重新整理。由於併發活動,緩衝區可能立即被重新讀入,因此結果在返回後立即過時。該函式僅用於開發人員測試。
pg_buffercache_evict_all() Function #pg_buffercache_evict_all() 函式與 pg_buffercache_evict() 函式非常相似。區別在於,pg_buffercache_evict_all() 函式不接受引數;而是嘗試驅逐緩衝區池中的所有緩衝區。它返回被驅逐的緩衝區數量、被重新整理的緩衝區數量以及無法被驅逐的緩衝區數量。被重新整理的緩衝區不一定是由我們重新整理的,它們可能由其他人重新整理。由於併發活動,緩衝區可能立即被重新讀入,因此結果在返回後立即過時。該函式僅用於開發人員測試。
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)
Mark Kirkwood <markir@paradise.net.nz>
設計建議:Neil Conway <neilc@samurai.com>
除錯建議:Tom Lane <tgl@sss.pgh.pa.us>
如果您在文件中看到任何不正確、與您在該特定功能上的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。