F.18. lt_prewarm

F.18.1. Functions
F.18.2. Configuration Parameters

The lt_prewarm module provides a convenient way to load relation data into either the operating system buffer cache or the LightDB buffer cache. Prewarming can be performed manually using the pg_prewarm function, or can be performed automatically by including lt_prewarm in shared_preload_libraries. In the latter case, the system will run a background worker which periodically records the contents of shared buffers in a file called autoprewarm.blocks and will, using 2 background workers, reload those same blocks after a restart.

Lightdb adds the function of automatic prewarming during startup (restart), including automatically prewarming the database, tables and indexes. When prewarming the database, it will prewarms all non system tables under the database (including partition tables and indexes under the table). When prewarming the table alone, it will also prewarms the partition tables and indexes of the table. Of course, when configuring the prewarming database and the tables under the database at the same time, we will not repeat the prewarming.

F.18.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

The first argument is the relation to be prewarmed. The second argument is the prewarming method to be used, as further discussed below; the third is the relation fork to be prewarmed, usually main. The fourth argument is the first block number to prewarm (NULL is accepted as a synonym for zero). The fifth argument is the last block number to prewarm (NULL means prewarm through the last block in the relation). The return value is the number of blocks prewarmed.

There are three available prewarming methods. prefetch issues asynchronous prefetch requests to the operating system, if this is supported, or throws an error otherwise. read reads the requested range of blocks; unlike prefetch, this is synchronous and supported on all platforms and builds, but may be slower. buffer reads the requested range of blocks into the database buffer cache.

Note that with any of these methods, attempting to prewarm more blocks than can be cached — by the OS when using prefetch or read, or by LightDB when using buffer — will likely result in lower-numbered blocks being evicted as higher numbered blocks are read in. Prewarmed data also enjoys no special protection from cache evictions, so it is possible that other system activity may evict the newly prewarmed blocks shortly after they are read; conversely, prewarming may also evict other data from cache. For these reasons, prewarming is typically most useful at startup, when caches are largely empty.

autoprewarm_start_worker() RETURNS void

Launch the main autoprewarm worker. This will normally happen automatically, but is useful if automatic prewarm was not configured at server startup time and you wish to start up the worker at a later time.

autoprewarm_dump_now() RETURNS int8

Update autoprewarm.blocks immediately. This may be useful if the autoprewarm worker is not running but you anticipate running it after the next restart. The return value is the number of records written to autoprewarm.blocks.

F.18.2. Configuration Parameters

lt_prewarm.autoprewarm (boolean)

Controls whether the server should run the autoprewarm worker. This is on by default. This parameter can only be set at server start.

lt_prewarm.autoprewarm_interval (int)

This is the interval between updates to autoprewarm.blocks. The default is 300 seconds. If set to 0, the file will not be dumped at regular intervals, but only when the server is shut down.

These parameters must be set in lightdb.conf. Typical usage might be:

# lightdb.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

lt_prewarm.lt_autoprewarm_dbs (text)

This parameter configures the list of databases to be prewarmed automatically. for example, lt_prewarm.lt_autoprewarm_dbs = 'db1, db2, db3'.

lt_prewarm.lt_autoprewarm_tables (text)

This parameter configures the list of tables to be prewarmed automatically. for example, lt_prewarm.lt_autoprewarm_tables = 'db1.schema1.t1, db1.schema1.t2, db1.schema2.t1, db2.schema1.t1'.

lt_prewarm.lt_autoprewarm_indexes (text)

This parameter configures the list of indexes to be prewarmed automatically. for example, lt_prewarm.lt_autoprewarm_indexes = 'db1.schema1.i1, db1.schema1.i2, db1.schema2.i1, db2.schema1.i1'.