1,问题引出
src/backend/storage/buffer/buf_init.c 文件中的NBuffers 怎么来的?
Size
BufferShmemSize(void)
{
Size size = 0;
/* size of buffer descriptors */
size = add_size(size, mul_size(NBuffers, sizeof(BufferDescPadded)));
2,gdb跟踪
posb@fed1:/posb> gdb /posb/in/bin/postgres
GNU gdb (GDB) Fedora 12.1-1.fc36
......
Reading symbols from /posb/in/bin/postgres...
(gdb) watch NBuffers
Hardware watchpoint 1: NBuffers
(gdb) r
Starting program: /posb/in/bin/postgres
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Hardware watchpoint 1: NBuffers
Old value = 1000
New value = 1024
InitializeOneGUCOption (gconf=0xebdb10 <ConfigureNamesInt+3024>) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:5735
5735 conf->gen.extra = conf->reset_extra = extra;
(gdb) c
Continuing.
Hardware watchpoint 1: NBuffers
Old value = 1024
New value = 16384
set_config_option (name=0x1132a28 "shared_buffers", value=0x1132a48 "128MB", context=context@entry=PGC_POSTMASTER, source=source@entry=PGC_S_FILE, action=action@entry=GUC_ACTION_SET, changeVal=<optimized out>, changeVal@entry=true, elevel=15, is_reload=false) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:7671
7671 set_extra_field(&conf->gen, &conf->gen.extra,
(gdb) l
7666 push_old_value(&conf->gen, action);
7667
7668 if (conf->assign_hook)
7669 conf->assign_hook(newval, newextra);
7670 *conf->variable = newval;
NBuffers 第一次设置为默认值。配置文件中有shared_buffers时,NBuffers会再一次设置。
再一次gdb
(gdb) b set_config_option
Breakpoint 2 at 0xaaff9b: file /posb/postgresql-14.4/src/backend/utils/misc/guc.c, line 7284.
(gdb) r
Breakpoint 2, set_config_option (name=0x1132970 "max_connections", value=0x1132990 "100", context=context@entry=PGC_POSTMASTER, source=source@entry=PGC_S_FILE, action=action@entry=GUC_ACTION_SET, changeVal=changeVal@entry=true, elevel=0, is_reload=false) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:7284
7284 {
(gdb)
Continuing.
Breakpoint 2, set_config_option (name=0x1132a28 "shared_buffers", value=0x1132a48 "128MB", context=context@entry=PGC_POSTMASTER, source=source@entry=PGC_S_FILE, action=action@entry=GUC_ACTION_SET, changeVal=changeVal@entry=true, elevel=0, is_reload=false) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:7284
7284 {
(gdb) s
7287 void *newextra = NULL;
......
convert_to_base_unit (value=value@entry=128, unit=0x1132a4b "MB", base_unit=base_unit@entry=8192, base_value=base_value@entry=0x7fffffffdff8) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:6622
6622 {
(gdb) s
6646 for (i = 0; *table[i].unit; i++)
(gdb)
6648 if (base_unit == table[i].base_unit &&
(gdb)
6651 double cvalue = value * table[i].multiplier;
(gdb) p value
$13 = 128
(gdb) p i
$10 = 17
(gdb) p table[17]
$11 = {
unit = "MB\000",
base_unit = 8192,
multiplier = 128
}
(gdb) p cvalue
$12 = 16384
(gdb) bt
#0 convert_to_base_unit (value=value@entry=128, unit=<optimized out>, base_unit=base_unit@entry=8192,
base_value=base_value@entry=0x7fffffffdff8) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:6660
#1 0x0000000000aae5f2 in parse_int (value=value@entry=0x1132a48 "128MB", result=result@entry=0x7fffffffe0c8, flags=8192,
hintmsg=hintmsg@entry=0x7fffffffe048) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:6868
#2 0x0000000000aaf9e1 in parse_and_validate_value (record=record@entry=0xebdb10 <ConfigureNamesInt+3024>,
name=name@entry=0x1132a28 "shared_buffers", value=value@entry=0x1132a48 "128MB", source=source@entry=PGC_S_FILE,
elevel=elevel@entry=15, newval=newval@entry=0x7fffffffe0c8, newextra=0x7fffffffe0c0)
at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:7109
#3 0x0000000000ab0af5 in set_config_option (name=0x1132a28 "shared_buffers", value=0x1132a48 "128MB",
context=context@entry=PGC_POSTMASTER, source=source@entry=PGC_S_FILE, action=action@entry=GUC_ACTION_SET, changeVal=<optimized out>,
changeVal@entry=true, elevel=15, is_reload=false) at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:7623
#4 0x0000000000ab89d3 in ProcessConfigFileInternal (context=context@entry=PGC_POSTMASTER, applySettings=applySettings@entry=true,
elevel=elevel@entry=15) at /posb/build_dir/src/backend/utils/misc/guc-file.l:441
#5 0x0000000000ab8cd9 in ProcessConfigFile (context=context@entry=PGC_POSTMASTER)
at /posb/build_dir/src/backend/utils/misc/guc-file.l:155
#6 0x0000000000ab8f24 in SelectConfigFiles (userDoption=userDoption@entry=0x0, progname=0x110f2a0 "postgres")
at /posb/postgresql-14.4/src/backend/utils/misc/guc.c:5918
#7 0x000000000083f5ce in PostmasterMain (argc=argc@entry=1, argv=argv@entry=0x110fee0)
at /posb/postgresql-14.4/src/backend/postmaster/postmaster.c:886
#8 0x000000000075a4ce in main (argc=1, argv=0x110fee0) at /posb/postgresql-14.4/src/backend/main/main.c:209
(gdb)
parse_int 处理 shared_buffers,如果没有加单位(MB),直接用参数数值设置NBuffers。