postgres.git / summary / log / commit / refs

commit    fa604e0dd07a39ba34f93d06ded8243280dffdeb
Author:   Andres Freund <andres@anarazel.de>
Date:     Thu Aug 05 02:19:44 2021 +0000

    pgbench: When using pipelining only do PQconsumeInput() when necessary.
    
    Up to now we did a PQconsumeInput() for each pipelined query, asking the OS
    for more input - which it often won't have, as all results might already have
    been sent. That turns out to have a noticeable performance impact.
    
    Alvaro Herrera reviewed the idea to add the PQisBusy() check, but not this
    concrete patch.
    
    Author: Andres Freund <andres@anarazel.de>
    Discussion: https://postgr.es/m/20210720180039.23rivhdft3l4mayn@alap3.anarazel.de
    Backpatch: 14, where libpq/pgbench pipelining was introduced.


src/bin/pgbench/pgbench.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 364b5a2e47d..129cf2ed61d 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3460,7 +3460,14 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) */ case CSTATE_WAIT_RESULT: pg_log_debug("client %d receiving", st->id); - if (!PQconsumeInput(st->con)) + + /* + * Only check for new network data if we processed all data + * fetched prior. Otherwise we end up doing a syscall for each + * individual pipelined query, which has a measurable + * performance impact. + */ + if (PQisBusy(st->con) && !PQconsumeInput(st->con)) { /* there's something wrong */ commandFailed(st, "SQL", "perhaps the backend died while processing"); [parent: e8086bd3ba0a]