pg_prewarm模块提供了一种便捷方式,可将关系数据加载到操作系统缓冲区缓存 或 PostgreSQL缓冲区缓存中。预热既可以使用 pg_prewarm函数手动执行,也可以通过将pg_prewarm加入 shared_preload_libraries自动执行。 在后一种情况下,系统会运行一个后台工作进程,定期将共享缓冲区的内容记录到名为 autoprewarm.blocks的文件中,并在重启后使用两个后台工作进程重新加载这些块。
pg_prewarm(regclass, mode text default 'buffer', fork text default 'main',
first_block int8 default null,
last_block int8 default null) RETURNS int8
第一个参数是要预热的关系。第二个参数是要使用的预热方法,下文会进一步讨论;第三个参数 是要预热的关系 fork,通常为main。第四个参数是要预热的第一个块号 (NULL可作为 0 的同义值);第五个参数是要预热的最后一个块号 (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>
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。