wal_buffers配置参数
Wal buffer是预写日志缓冲区,作为共享内存缓存每个事务产生的WAL日志。那么这个缓冲区多大呢?它由配置参数wal_buffers控制,默认值是-1,表示大小为shared_buffers的1/32,单位是字节大小,比如64kB。
我们在guc.c代码文件中找到对应的参数位置:在ConfigureNamesInt数组中
{
{"wal_buffers", PGC_POSTMASTER, WAL_SETTINGS,
gettext_noop("Sets the number of disk-page buffers in shared memory for WAL."),
NULL,
GUC_UNIT_XBLOCKS | GUC_NOT_IN_SAMPLE
},
&XLOGbuffers,
-1, -1, (INT_MAX / XLOG_BLCKSZ),
check_wal_buffers, NULL, NULL
},
也就是wal_buffers在代码中对应的变量值为XLOGbuffers,这个值是int型:
int XLOGbuffers = -1;
疑惑来了,wal_buffers是字节大小,配置文件中可以写成:64kB,这个又是如何转换成整型XLOGbuffers的?
看下wal buffer初始化流程:
WAL BUFFER大小:可以了解到XLOGbuffers是页数,每页大小XLOG_BLCKSZ
XLOGShmemInit
memset(XLogCtl->pages, 0, (Size) XLOG_BLCKSZ * XLOGbuffers);
Wal buffer即为XLogCtl->pages,大小为XLOG_BLCKSZ*XLOGbuffers。
另一个疑惑:wal_buffers如何由kB转换成页数的?
可以看下配置文件配置参数加载过程:
SelectConfigFiles函数为加载postgresql.conf文件,并解析配置项到变量。在此parse_int函数中进行转换。
本文分享自 yanzongshuaiDBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!