Redrock Postgres 搜索 英文
版本: 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

F.28. pg_prewarm — 将关系数据预加载到缓冲区高速缓存 #

F.28.1. 函数
F.28.2. 配置参数
F.28.3. 创作人

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

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 被接受为零的同义词)。第五个参数是要预热的最后一个块号(NULL 表示预热到关联中的最后一个块)。返回值是预热的块数。

有三种可用的预热方法。prefetch 针对操作系统发出异步预取请求(如果支持),否则抛出错误。read 读取请求的块范围;与 prefetch 不同,read 是同步的并且在所有平台和版本中都受支持,但可能较慢。buffer 将请求的块范围读入数据库缓冲区缓存。

请注意使用其中任何一个方法时,尝试预热比通过操作系统(在使用 prefetchread 时)可缓存或比 PostgreSQL(在使用 buffer 时)可缓存的更多块可能会导致在读入高编号块时逐出低编号块。此外,预热的块不能享有针对缓存逐出的特殊保护,因此其他系统活动可能在读入新预热的块后不久便逐出它们;相反,预热也可能会从缓存中逐出其他数据。由于这些原因,预热通常在启动时(也就是缓存基本为空时)最有用。

autoprewarm_start_worker() RETURNS void

启动主自动预热工作程序。这通常会自动发生,但如果在服务器启动时未配置自动预热并且您希望稍后启动工作程序,则此功能非常有用。

autoprewarm_dump_now() RETURNS int8

立即更新 autoprewarm.blocks。如果自动预热工作程序未在运行,但您预期在下次重启后运行,则此操作可能非常有用。返回值是写入 autoprewarm.blocks 的记录数。

F.28.2. 配置参数 #

pg_prewarm.autoprewarm (布尔值)

控制服务器是否应运行自动预热工作线程,默认情况下为“开”。此参数仅能在服务器启动时设置。

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.28.3. 作者 #

Robert Haas