F.30. pg_prewarm — 将关系数据预加载到缓冲区高速缓存中#
pg_prewarm
模块提供了一种将关系数据加载到操作系统缓冲区高速缓存或PostgreSQL缓冲区高速缓存中的便捷方式。预热可以使用pg_prewarm
函数手动执行,也可以通过在shared_preload_libraries中包含pg_prewarm
自动执行。在后一种情况下,系统将运行一个后台工作进程,该进程会定期将共享缓冲区的内容记录到名为autoprewarm.blocks
的文件中,并在重新启动后使用 2 个后台工作进程重新加载这些相同的块。
F.30.1. 函数#
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
被接受为零的同义词)。第五个参数是要预热的最后一个块号(NULL
表示预热到关联中的最后一个块)。返回值是预热的块数。
有三种可用的预热方法。如果支持,prefetch
向操作系统发出异步预取请求,否则抛出错误。read
读取请求的块范围;与prefetch
不同,它是同步的,并且在所有平台和版本上都受支持,但可能更慢。buffer
将请求的块范围读入数据库缓冲区缓存。
请注意,使用这些方法中的任何一种,尝试预热比可缓存的块数更多的块(在使用prefetch
或read
时由操作系统缓存,在使用buffer
时由PostgreSQL缓存)很可能会导致在读入更高编号的块时驱逐编号较低的块。预热数据也没有免受缓存驱逐的特殊保护,因此其他系统活动可能会在读取新预热块后不久将其驱逐;相反,预热也可能从缓存中驱逐其他数据。由于这些原因,预热通常在启动时最有用,那时缓存基本上是空的。
autoprewarm_start_worker() RETURNS void
启动主自动预热工作进程。这通常会自动发生,但如果在服务器启动时未配置自动预热,并且您希望稍后启动工作进程,则此方法很有用。
autoprewarm_dump_now() RETURNS int8
立即更新autoprewarm.blocks
。如果自动预热工作进程未运行,但您预计在下次重启后运行它,这可能很有用。返回值是写入autoprewarm.blocks
的记录数。
F.30.2. 配置参数#
pg_prewarm.autoprewarm_interval
(integer
)这是更新
autoprewarm.blocks
之间的间隔。默认值为 300 秒。如果设置为 0,则文件不会按常规间隔转储,而只在服务器关闭时转储。
这些参数必须在postgresql.conf
中设置。典型用法可能是
# postgresql.conf
shared_preload_libraries = 'pg_prewarm'
pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s
F.30.3. 作者#
Robert Haas<[[email protected]](/cdn-cgi/l/email-protection#24564c45455764544b57504356415755480a4b5643)>