E.18. lt_prewarm

E.18.1. 函数
E.18.2. 配置参数

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

LightDB 在启动(重启)过程中增加了自动预热的功能,包括自动预热数据库、表和索引。预热数据库时,它会预热数据库下的所有非系统表(包括表下的分区表和索引)。预热表时,它也会预热表的分区表和索引。当然,在同时配置预热数据库和数据库下的表时,我们不会重复预热。

E.18.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 不同,它是同步的,并且在所有平台和构建中都支持,但可能会更慢。 buffer 将请求范围内的块读入数据库缓存中。

注意,使用任何一种方法,尝试预热的块数超过了可以缓存的数量 — 当使用 prefetchread 时,由操作系统缓存;当使用 buffer 时,由 LightDB 缓存 — 可能会导致较低编号的块被逐出,因为高编号的块被读入。预热的数据也没有受到缓存逐出的特殊保护,因此可能会发生其他系统活动在读取后不久将新预热的块逐出;相反,预热也可能从缓存中逐出其他数据。因此,通常在启动时,当缓存大部分为空时,预热最有用。

      autoprewarm_start_worker() RETURNS void
    

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

      autoprewarm_dump_now() RETURNS int8
    

立即更新 autoprewarm.blocks。如果 autoprewarm 工作进程未运行但您预计在下次重启后运行它,则此操作可能很有用。返回值是写入 autoprewarm.blocks 的记录数。

E.18.2. 配置参数

lt_prewarm.autoprewarm (boolean)

控制服务器是否应该运行 autoprewarm 工作进程。默认情况下是开启的。此参数只能在服务器启动时设置。

lt_prewarm.autoprewarm_interval (int)

这是更新 autoprewarm.blocks 的时间间隔。默认值为 300 秒。如果设置为 0,则文件将不会在固定间隔内转储,而只有在服务器关闭时才会转储。

这些参数必须在 lightdb.conf 中设置。 典型用法可能是:

# lightdb.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

lt_prewarm.lt_autoprewarm_dbs (text)

此参数配置要自动预热的数据库列表。 例如, lt_prewarm.lt_autoprewarm_dbs = 'db1, db2, db3'

lt_prewarm.lt_autoprewarm_tables (text)

此参数配置要自动预热的表的列表。 例如, lt_prewarm.lt_autoprewarm_tables = 'db1.schema1.t1, db1.schema1.t2, db1.schema2.t1, db2.schema1.t1'

lt_prewarm.lt_autoprewarm_indexes (text)

此参数配置要自动预热的索引列表。 例如, lt_prewarm.lt_autoprewarm_indexes = 'db1.schema1.i1, db1.schema1.i2, db1.schema2.i1, db2.schema1.i1'