F.28. pg_prewarm — 将关系数据预热到缓冲区缓存中 #
pg_prewarm 模块提供了一种便捷方式,可将关系数据加载到操作系统缓冲区缓存或 PostgreSQL 缓冲区缓存中。预热既可以使用
pg_prewarm 函数手动执行,也可以通过将 pg_prewarm 加入 shared_preload_libraries 自动执行。在后一种情况下,系统会运行一个后台工作进程,定期将共享缓冲区的内容记录到名为
autoprewarm.blocks 的文件中,并在重启后使用两个后台工作进程重新加载这些块。
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 可作为 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 的记录数。
F.28.2. 配置参数 #
这些参数必须在 postgresql.conf 中设置。典型用法如下:
# postgresql.conf shared_preload_libraries = 'pg_prewarm' pg_prewarm.autoprewarm = true pg_prewarm.autoprewarm_interval = 300s
F.28.3. 作者 #
Robert Haas <rhaas@postgresql.org>
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.