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函数中进行转换。