Hi, On 2020-02-27 10:01:00 -0800, Andres Freund wrote: > If so, should this be done unconditionally? A new option? Included in an > existing one somehow?
FWIW, leaving windows, error handling, and other annoyances aside, this can be implemented fairly simply. See below. As an example of the difference: Before: andres@awork3:~/build/postgres/dev-optimize/vpath$ ./src/bin/pgbench/pgbench -M prepared -c 5000 -j 100 -T 100 -P1 -S starting vacuum...end. progress: 100.4 s, 515307.4 tps, lat 1.374 ms stddev 7.739 transaction type: <builtin: select only> scaling factor: 30 query mode: prepared number of clients: 5000 number of threads: 100 duration: 100 s number of transactions actually processed: 51728348 latency average = 1.374 ms latency stddev = 7.739 ms tps = 513802.541226 (including connections establishing) tps = 521342.427158 (excluding connections establishing) Note that there's no progress report until the end. That's because the main thread didn't get a connection until the other threads were done. After: pgbench -M prepared -c 5000 -j 100 -T 100 -P1 -S starting vacuum...end. progress: 1.5 s, 9943.5 tps, lat 4.795 ms stddev 14.822 progress: 2.0 s, 380312.6 tps, lat 1.728 ms stddev 15.461 progress: 3.0 s, 478811.1 tps, lat 2.052 ms stddev 31.687 progress: 4.0 s, 470804.6 tps, lat 1.941 ms stddev 24.661 I think this also shows that "including/excluding connections establishing" as well as some of the other stats reported pretty bogus. In the 'before' case a substantial numer of the connections had not yet been established until the end of the test run! diff --git i/src/bin/pgbench/pgbench.c w/src/bin/pgbench/pgbench.c index 1159757acb0..1a82c6a290e 100644 --- i/src/bin/pgbench/pgbench.c +++ w/src/bin/pgbench/pgbench.c @@ -310,6 +310,8 @@ typedef struct RandomState /* Various random sequences are initialized from this one. */ static RandomState base_random_sequence; +pthread_barrier_t conn_barrier; + /* * Connection state machine states. */ @@ -6110,6 +6112,8 @@ main(int argc, char **argv) /* start threads */ #ifdef ENABLE_THREAD_SAFETY + pthread_barrier_init(&conn_barrier, NULL, nthreads); + for (i = 0; i < nthreads; i++) { TState *thread = &threads[i]; @@ -6265,6 +6269,8 @@ threadRun(void *arg) INSTR_TIME_SET_CURRENT(thread->conn_time); INSTR_TIME_SUBTRACT(thread->conn_time, thread->start_time); + pthread_barrier_wait(&conn_barrier); + /* explicitly initialize the state machines */ for (i = 0; i < nstate; i++) { Greetings, Andres Freund