F.27. pg_prewarm

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

F.27.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向支持的 os 发出异步预取请求(如果支持),否则将引发错误。 read读取请求的块范围;与prefetch不同,它是同步的,并且在所有平台和构建上均受支持,但可能会更慢。 buffer将请求的块范围读入数据库缓冲区高速缓存。

请注意,使用这些方法中的任何一种,尝试预热比可缓存的块更多的数量(使用prefetchread时由 OS 或使用buffer时由 PostgreSQL 进行预热)可能会导致编号较低的块被驱逐,因为读取了编号较高的块预热的数据也不受缓存逐出的保护,因此其他系统活动可能会在读取新预热的块后不久将其逐出。相反,预热也可能会将其他数据从缓存中逐出。由于这些原因,通常在启动时(缓存大部分为空),预热通常是最有用的。

autoprewarm_start_worker() RETURNS void

启动主要的自动预热工作器。这通常会自动发生,但是如果在服务器启动时未配置自动预热并且您希望稍后再启动工作服务器,则很有用。

autoprewarm_dump_now() RETURNS int8

立即更新autoprewarm.blocks。如果自动预热工作程序未运行,但您希望在下一次重新启动后运行它,这可能很有用。返回值是写入autoprewarm.blocks的记录数。

F.27.2. 配置参数

  • pg_prewarm.autoprewarm ( boolean )

    • 控制服务器是否应运行自动预热工作器。默认情况下处于启用状态。该参数只能在服务器启动时设置。
  • pg_prewarm.autoprewarm_interval ( int )

    • 这是更新到autoprewarm.blocks的间隔。默认值为 300 秒。如果设置为 0,则不会定期转储文件,而仅在关闭服务器时转储文件。

F.27.3. Author

罗伯特·哈斯<[email protected]>