一组用于从 LightDB 中管理内存页面的函数 |
一组使用 mincore 探索缓存内存来处理关系低级管理的函数。
在 LightDB 中,每个表或索引被分割为(通常为)1GB 的段,每个段在内存中被分割为页面,然后在文件系统中被分割为块。
这些函数允许您了解操作系统页面缓存中关系的哪些磁盘块以及数量。它可以将结果提供为 VarBit,并可以存储在表中。 然后使用此表,可以为关系的每个块恢复页面缓存状态,甚至在另一个服务器上,感谢流复制。
其他函数用于在整个关系(每个段)上设置 POSIX_FADVISE 标志。最有用的可能是 WILLNEED 和 DONTNEED,分别将关系每个段的块推入和弹出页面缓存。
每个函数至少使用表名或索引名(或 oid)作为参数调用,并遍历关系的每个段。
这里是一些用法示例。如果您想要更多细节,请参阅文档_。
可能有用:
cedric=# select * from pgfincore('ltbench_accounts'); relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty --------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+------------- base/11874/16447 | 0 | 4096 | 262144 | 262144 | 1 | 81016 | | 0 | 0 base/11874/16447.1 | 1 | 4096 | 65726 | 65726 | 1 | 81016 | | 0 | 0 (2 rows) Time: 31.563 ms
您可能希望尝试将表或索引保留在 OS 页面缓存中,或在执行您熟知的大型查询之前预加载表(减少查询时间)。
要做到这一点,只需执行以下查询:
cedric=# select * from pgfadvise_willneed('ltbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free --------------------+--------------+--------------+--------------- base/11874/16447 | 4096 | 262144 | 169138 base/11874/16447.1 | 4096 | 65726 | 103352 (2 rows) Time: 4462,936 ms
列 os_page_size 报告页面大小为 4KB。
列 rel_os_pages 是指定文件的页面数。
列 os_pages_free 是内存中(用于缓存)的空闲页面数。
您可能希望将表或索引还原到 OS 页面缓存中,就像在快照时一样。 例如,如果您必须重新启动服务器,则当 LightDB 启动时,由于 LightDB 或操作系统关于涉及这些第一个查询的关系的缓存中都没有页面,因此第一个查询可能会变慢。
执行快照和恢复非常简单:
-- 快照 cedric=# create table pgfincore_snapshot as cedric-# select 'ltbench_accounts'::text as relname,*,now() as date_snapshot cedric-# from pgfincore('ltbench_accounts',true); -- 恢复 cedric=# select * from pgfadvise_loader('ltbench_accounts', 0, true, true, (select databit from pgfincore_snapshot where relname='ltbench_accounts' and segment = 0)); relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded ------------------+--------------+---------------+--------------+---------------- base/11874/16447 | 4096 | 80867 | 262144 | 0 (1 row) Time: 35.349 ms
列 pages_loaded 报告已读取到内存中的页面数(它们可能已经在内存中)。
列 pages_unloaded 报告已从内存中移除的页面数(它们可能不在内存中);
pgsysconf(OUT os_page_size bigint, OUT os_pages_free bigint, OUT os_total_pages bigint) RETURNS record
pgsysconf_pretty(OUT os_page_size text, OUT os_pages_free text, OUT os_total_pages text) RETURNS record
pgfadvise(IN relname regclass, IN fork text, IN action int, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_willneed(IN relname regclass, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_dontneed(IN relname regclass, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_normal(IN relname regclass, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_sequential(IN relname regclass, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_random(IN relname regclass, OUT relpath text, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT os_pages_free bigint) RETURNS setof record
pgfadvise_loader(IN relname regclass, IN fork text, IN segment int, IN load bool, IN unload bool, IN databit varbit, OUT relpath text, OUT os_page_size bigint, OUT os_pages_free bigint, OUT pages_loaded bigint, OUT pages_unloaded bigint) RETURNS setof record
pgfadvise_loader(IN relname regclass, IN segment int, IN load bool, IN unload bool, IN databit varbit, OUT relpath text, OUT os_page_size bigint, OUT os_pages_free bigint, OUT pages_loaded bigint, OUT pages_unloaded bigint) RETURNS setof record
pgfincore(IN relname regclass, IN fork text, IN getdatabit bool, OUT relpath text, OUT segment int, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT pages_mem bigint, OUT group_mem bigint, OUT os_pages_free bigint, OUT databit varbit, OUT pages_dirty bigint, OUT group_dirty bigint) RETURNS setof record
pgfincore(IN relname regclass, IN getdatabit bool, OUT relpath text, OUT segment int, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT pages_mem bigint, OUT group_mem bigint, OUT os_pages_free bigint, OUT databit varbit, OUT pages_dirty bigint, OUT group_dirty bigint) RETURNS setof record
pgfincore(IN relname regclass, OUT relpath text, OUT segment int, OUT os_page_size bigint, OUT rel_os_pages bigint, OUT pages_mem bigint, OUT group_mem bigint, OUT os_pages_free bigint, OUT databit varbit, OUT pages_dirty bigint, OUT group_dirty bigint) RETURNS setof record
这个函数输出操作系统块的大小以及操作系统页面缓冲区中的空闲页面数。
cedric=# select * from pgsysconf(); os_page_size | os_pages_free | os_total_pages --------------+---------------+---------------- 4096 | 80431 | 4094174
与上面相同,但有更好的输出形式。
cedric=# select * from pgsysconf_pretty(); os_page_size | os_pages_free | os_total_pages --------------+---------------+---------------- 4096 bytes | 314 MB | 16 GB
此函数在当前关系上设置WILLNEED标志。这意味着操作系统将尝试尽可能多地加载关系的页面。主要思想是在服务器启动时预加载文件,可能使用缓存命中/未命中比率或最常使用的关系/索引。
cedric=# select * from pgfadvise_willneed('ltbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free --------------------+--------------+--------------+--------------- base/11874/16447 | 4096 | 262144 | 80650 base/11874/16447.1 | 4096 | 65726 | 80650
此函数在当前关系上设置DONTNEED标志。这意味着如果需要释放一些内存,操作系统将首先卸载文件的页面。主要思想是在文件不再有用时卸载它们(而不是卸载可能更有趣的页面)。
cedric=# select * from pgfadvise_dontneed('ltbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free --------------------+--------------+--------------+--------------- base/11874/16447 | 4096 | 262144 | 342071 base/11874/16447.1 | 4096 | 65726 | 408103
此函数在当前关系上设置NORMAL标志。
此函数在当前关系上设置SEQUENTIAL标志。
此函数在当前关系上设置RANDOM标志。
此函数允许直接与页面缓存交互。它可以根据表示加载/卸载页面映射的varbit从内存中加载和/或卸载页面。
使用关系ltbench_accounts,段0和任意的varbit映射:
-- Loading and Unloading cedric=# select * from pgfadvise_loader('ltbench_accounts', 0, true, true, B'111000'); relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded ------------------+--------------+---------------+--------------+---------------- base/11874/16447 | 4096 | 408376 | 3 | 3 -- Loading cedric=# select * from pgfadvise_loader('ltbench_accounts', 0, true, false, B'111000'); relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded ------------------+--------------+---------------+--------------+---------------- base/11874/16447 | 4096 | 408370 | 3 | 0 -- Unloading cedric=# select * from pgfadvise_loader('ltbench_accounts', 0, false, true, B'111000'); relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded ------------------+--------------+---------------+--------------+---------------- base/11874/16447 | 4096 | 408370 | 0 | 3
此函数提供有关文件系统缓存的信息(页面缓存)。
cedric=# select * from pgfincore('ltbench_accounts'); relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty --------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+------------- base/11874/16447 | 0 | 4096 | 262144 | 3 | 1 | 408444 | | 0 | 0 base/11874/16447.1 | 1 | 4096 | 65726 | 0 | 0 | 408444 | | 0 | 0
对于指定的关系,它返回:
relpath:关系路径
segment:分析的段号
os_page_size:一页的大小
rel_os_pages:关系的总页面数
pages_mem:在页面缓存中关系的总页面数。(不是来自LightDB的共享缓冲区,而是操作系统缓存中的页面)
group_mem:相邻的pages_mem页面组数
os_page_free:操作系统页面缓存中的空闲页面数
databit:文件的varbit映射,因为其大小而不输出。使用pgfincore(“ ltbench_accounts ”,true)以激活它。
pages_dirty:如果定义了HAVE_FINCORE常量,并且平台提供相关信息,则与pages_mem类似,但用于脏页面。
group_dirty:如果定义了HAVE_FINCORE常量,并且平台提供相关信息,则与group_mem类似,但用于脏页面。
您可以使用以下错误级别调试ltfincore:DEBUG1和DEBUG5。
例如:
set client_min_messages TO debug1; -- debug5 is only usefull to trace each block
ltfincore需要mincore()或fincore()和POSIX_FADVISE。
当平台未提供POSIX_FADVISE时,ltfincore有一个受限模式。