Postgresql 中文操作指南

F.30. pg_prewarm — preload relation data into buffer caches #

pg_prewarm 模块提供了一种便捷的方法,可以将关系数据加载到操作系统缓冲区高速缓存或 PostgreSQL 缓冲区高速缓存中。预热可以使用 pg_prewarm 函数手动执行,也可以通过在 shared_preload_libraries 中包含 pg_prewarm 自动执行。在后一种情况下,系统将运行一个后台工作程序,该工作程序会定期将共享缓冲区的内容记录到名为 autoprewarm.blocks 的文件中,并将使用 2 个后台工作程序在重新启动后重新加载这些相同的块。

F.30.1. Functions #

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_ 的记录数。

F.30.2. Configuration Parameters #

  • pg_prewarm.autoprewarm (boolean)

    • 控制服务器是否应该运行自动预热工作程序。默认情况下启用。此参数只能在服务器启动时设置。

  • 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