2024 年 9 月 26 日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4

F.28. pg_prewarm — 将关系数据预加载到缓冲区缓存 #

pg_prewarm 模块提供了一种便捷的方式,可以将关系数据加载到操作系统缓冲区缓存或 PostgreSQL 缓冲区缓存中。预热可以通过使用 pg_prewarm 函数手动执行,也可以通过将 pg_prewarm 包含在 shared_preload_libraries 中自动执行。在后一种情况下,系统将运行一个后台工作进程,该进程定期将共享缓冲区的内容记录到名为 autoprewarm.blocks 的文件中,并使用 2 个后台工作进程在重新启动后重新加载这些相同的块。

F.28.1. 函数 #

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 将请求的块范围读入数据库缓冲区缓存。

请注意,使用任何这些方法,尝试预热的块数超过缓存所能容纳的块数——当使用 prefetchread 时为操作系统,当使用 buffer 时为 PostgreSQL——可能会导致较低编号的块在读取更高编号的块时被逐出。预热数据也不享受来自缓存逐出的特殊保护,因此其他系统活动可能会在预热块被读取后不久将它们逐出;相反,预热也可能会将其他数据从缓存中逐出。出于这些原因,预热通常在启动时最有用,此时缓存基本上是空的。

autoprewarm_start_worker() RETURNS void

启动主 autoprewarm 工作进程。这通常会自动发生,但如果您在服务器启动时未配置自动预热,并且希望稍后启动工作进程,则此方法很有用。

autoprewarm_dump_now() RETURNS int8

立即更新 autoprewarm.blocks。如果 autoprewarm 工作进程未运行,但您预计在下次重新启动后运行它,这可能很有用。返回值是写入 autoprewarm.blocks 的记录数。

F.28.2. 配置参数 #

pg_prewarm.autoprewarm (布尔值)

控制服务器是否应该运行 autoprewarm 工作进程。默认情况下为开启。此参数只能在服务器启动时设置。

pg_prewarm.autoprewarm_interval (整数)

这是更新 autoprewarm.blocks 的间隔。默认值为 300 秒。如果设置为 0,则文件不会定期转储,而只会在服务器关闭时转储。

这些参数必须在 postgresql.conf 中设置。典型的用法可能是

# postgresql.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

F.28.3. 作者 #

Robert Haas

提交更正

如果您在文档中发现任何错误,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。