pg_prewarm
模組提供了一種方便的方法,可將關聯資料載入到作業系統緩衝區快取或 PostgreSQL 緩衝區快取中。 可以使用 pg_prewarm
函數手動執行預熱,也可以透過在 shared_preload_libraries 中包含 pg_prewarm
來自動執行。 在後一種情況下,系統將執行一個背景工作程序,該程序會定期將共享緩衝區的內容記錄在名為 autoprewarm.blocks
的檔案中,並將使用 2 個背景工作程序,在重新啟動後重新載入相同的區塊。
pg_prewarm(regclass, mode text default 'buffer', fork text default 'main', first_block int8 default null, last_block int8 default null) RETURNS int8
第一個引數是要預熱的關聯。 第二個引數是要使用的預熱方法,如下文進一步討論;第三個是預熱的關聯分支,通常為 main
。 第四個引數是要預熱的第一個區塊編號(NULL
被接受為零的同義詞)。 第五個引數是要預熱的最後一個區塊編號(NULL
表示預熱到關聯中的最後一個區塊)。 傳回值是預熱的區塊數。
有三種可用的預熱方法。 如果支援,prefetch
會向作業系統發出非同步預先擷取請求,否則會擲回錯誤。 read
讀取請求的區塊範圍;與 prefetch
不同,這是同步的,並且在所有平台和組建上都支援,但可能較慢。 buffer
將請求的區塊範圍讀取到資料庫緩衝區快取中。
請注意,使用任何這些方法時,嘗試預熱比可以快取的區塊更多的區塊,無論是作業系統在使用 prefetch
或 read
時,還是 PostgreSQL 在使用 buffer
時,都可能導致編號較低的區塊在讀取編號較高的區塊時被逐出。 預熱的資料也沒有受到快取逐出的特殊保護,因此其他系統活動可能會在讀取後不久逐出新預熱的區塊;相反地,預熱也可能會從快取中逐出其他資料。 由於這些原因,預熱通常在啟動時最有用,此時快取基本上是空的。
autoprewarm_start_worker() RETURNS void
啟動主 autoprewarm 工作程序。 這通常會自動發生,但如果在伺服器啟動時未設定自動預熱,並且您希望稍後啟動工作程序,則此功能很有用。
autoprewarm_dump_now() RETURNS int8
立即更新 autoprewarm.blocks
。 如果 autoprewarm 工作程序未執行,但您預計在下次重新啟動後執行它,則這可能很有用。 傳回值是寫入 autoprewarm.blocks
的記錄數。
這些參數必須在 postgresql.conf
中設定。 典型的用法可能是
# postgresql.conf shared_preload_libraries = 'pg_prewarm' pg_prewarm.autoprewarm = true pg_prewarm.autoprewarm_interval = 300s
Robert Haas <rhaas@postgresql.org>
如果您在文件中看到任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來回報文件問題。