static void test_config_settings(void) { /* This macro defines the minimum shared_buffers we want for a given max_connections value. The arrays show the settings to try. */ #define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10) static const int trial_conns[] = {100, 50, 40, 30, 20}; static const int trial_bufs[] = {16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,1000, 900, 800, 700, 600, 500,400, 300, 200, 100, 50}; char cmd[MAXPGPATH]; const int connslen = sizeof(trial_conns) / sizeof(int); const int bufslen = sizeof(trial_bufs) / sizeof(int); int i,status,test_conns,test_buffs,ok_buffers = 0; // 测试平台最佳得DSM动态共享内存实现方式 /* Need to determine working DSM implementation first so that subsequent tests don't fail because DSM setting doesn't work. */ printf(_("selecting dynamic shared memory implementation ... ")); fflush(stdout); dynamic_shared_memory_type = choose_dsm_implementation(); printf("%s\n", dynamic_shared_memory_type); /* Probe for max_connections before shared_buffers, since it is subject to more constraints than shared_buffers. */ printf(_("selecting default max_connections ... ")); fflush(stdout); for (i = 0; i < connslen; i++) { test_conns = trial_conns[i]; test_buffs = MIN_BUFS_FOR_CONNS(test_conns); snprintf(cmd, sizeof(cmd),"\"%s\" --boot -x0 %s -c max_connections=%d -c shared_buffers=%d -c dynamic_shared_memory_type=%s < \"%s\" > \"%s\" 2>&1",backend_exec, boot_options,test_conns, test_buffs,dynamic_shared_memory_type,DEVNULL, DEVNULL); status = system(cmd); if (status == 0) { ok_buffers = test_buffs; break; } } if (i >= connslen) i = connslen - 1; n_connections = trial_conns[i]; printf("%d\n", n_connections);
调用postgres --boot -x0 -F -c max_connections=test_conns -c shared_buffers=test_buffs -c dynamic_shared_memory_type=dynamic_shared_memory_type < DEVNULL > DEVNULL 2>&1 进行测试max_connections大小
printf(_("selecting default shared_buffers ... ")); fflush(stdout); for (i = 0; i < bufslen; i++){ /* Use same amount of memory, independent of BLCKSZ */ test_buffs = (trial_bufs[i] * 8192) / BLCKSZ; if (test_buffs <= ok_buffers){ test_buffs = ok_buffers; break; } snprintf(cmd, sizeof(cmd),"\"%s\" --boot -x0 %s -c max_connections=%d -c shared_buffers=%d -c dynamic_shared_memory_type=%s < \"%s\" > \"%s\" 2>&1", backend_exec, boot_options, n_connections, test_buffs, dynamic_shared_memory_type, DEVNULL, DEVNULL); status = system(cmd); if (status == 0) break; } n_buffers = test_buffs; if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0) printf("%dMB\n", (n_buffers * (BLCKSZ / 1024)) / 1024); else printf("%dkB\n", n_buffers * (BLCKSZ / 1024)); printf(_("selecting default time zone ... ")); fflush(stdout); default_timezone = select_default_timezone(share_path); printf("%s\n", default_timezone ? default_timezone : "GMT"); }
调用postgres --boot -x0 -F -c max_connections=n_connections -c shared_buffers=test_buffs -c dynamic_shared_memory_type=dynamic_shared_memory_type < DEVNULL > DEVNULL 2>&1 进行测试shared_buffers大小