pg_prewarm 模块提供一种便捷方式,将关系数据加载到操作系统缓冲区缓存或 PostgreSQL 缓冲区缓存中。预热可以通过 pg_prewarm 函数手动执行,也可以通过将 pg_prewarm 加入 shared_preload_libraries 自动执行。在后一种情况下,系统会运行一个后台工作进程,周期性地将共享缓冲区的内容记录到名为 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 时受限于操作系统,使用 buffer 时受限于 PostgreSQL — 那么随着更高编号块被读入,较低编号的块很可能会被驱逐。预热的数据也没有任何特殊的缓存驱逐保护,因此其他系统活动可能在预热块刚被读入后不久就将其驱逐;反过来,预热也可能将其他数据从缓存中驱逐。出于这些原因,预热通常在启动时缓存大部分为空的情况下最为有用。
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>