diff options
author | Andres Freund <andres@anarazel.de> | 2021-08-04 19:19:44 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2021-08-04 19:19:44 -0700 |
commit | 87bff68840d542011ed8f60427502fb90fdf2873 (patch) | |
tree | e67daa4b9845c67731a96d765fdeb770cedee930 | |
parent | 1bc8e7b0991c1eae5fa6dc2d29bb2280efb52740 (diff) | |
download | postgresql-87bff68840d542011ed8f60427502fb90fdf2873.tar.gz postgresql-87bff68840d542011ed8f60427502fb90fdf2873.zip |
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.
-rw-r--r-- | src/bin/pgbench/pgbench.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 55d14604c02..b0e20c46ae3 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3461,7 +3461,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"); |