pg_prewarm
模块提供了一种便捷的方法,可以将关系数据加载到操作系统缓冲区缓存或 PostgreSQL 缓冲区缓存中。可以使用 pg_prewarm
函数手动执行预热,或者通过在 shared_preload_libraries 中包含 pg_prewarm
来自动执行预热。在后一种情况下,系统将运行一个后台工作进程,该进程会定期将共享缓冲区的内容记录到一个名为 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_dump_now() RETURNS int8
立即更新 autoprewarm.blocks
。如果自动预热工作进程未运行,但您预计在下次重启后运行它,则此功能可能很有用。返回值是写入 autoprewarm.blocks
的记录数。
这些参数必须在 postgresql.conf
中设置。典型的用法可能是
# postgresql.conf shared_preload_libraries = 'pg_prewarm' pg_prewarm.autoprewarm = true pg_prewarm.autoprewarm_interval = 300s
Robert Haas <[email protected]>
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步说明的内容,请使用此表单报告文档问题。