Lift the limitation that # of clients must be a multiple of # of threads

Fabien Coelho
This commit is contained in:
Heikki Linnakangas 2015-07-03 10:45:40 +03:00
parent 8650d161ae
commit ba3deeefb0
2 changed files with 20 additions and 10 deletions

View File

@ -326,8 +326,7 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
<para>
Number of worker threads within <application>pgbench</application>.
Using more than one thread can be helpful on multi-CPU machines.
The number of clients must be a multiple of the number of threads,
since each thread is given the same number of client sessions to manage.
Clients are distributed as evenly as possible among available threads.
Default is 1.
</para>
</listitem>

View File

@ -2819,6 +2819,7 @@ main(int argc, char **argv)
int64 latency_late = 0;
int i;
int nclients_dealt;
#ifdef HAVE_GETRLIMIT
struct rlimit rlim;
@ -3114,6 +3115,14 @@ main(int argc, char **argv)
}
}
/*
* Don't need more threads than there are clients. (This is not merely an
* optimization; throttle_delay is calculated incorrectly below if some
* threads have no clients assigned to them.)
*/
if (nthreads > nclients)
nthreads = nclients;
/* compute a per thread delay */
throttle_delay *= nthreads;
@ -3153,12 +3162,6 @@ main(int argc, char **argv)
if (nxacts <= 0 && duration <= 0)
nxacts = DEFAULT_NXACTS;
if (nclients % nthreads != 0)
{
fprintf(stderr, "number of clients (%d) must be a multiple of number of threads (%d)\n", nclients, nthreads);
exit(1);
}
/* --sampling-rate may be used only with -l */
if (sample_rate > 0.0 && !use_log)
{
@ -3359,19 +3362,24 @@ main(int argc, char **argv)
/* set up thread data structures */
threads = (TState *) pg_malloc(sizeof(TState) * nthreads);
nclients_dealt = 0;
for (i = 0; i < nthreads; i++)
{
TState *thread = &threads[i];
thread->tid = i;
thread->state = &state[nclients / nthreads * i];
thread->nstate = nclients / nthreads;
thread->state = &state[nclients_dealt];
thread->nstate =
(nclients - nclients_dealt + nthreads - i - 1) / (nthreads - i);
thread->random_state[0] = random();
thread->random_state[1] = random();
thread->random_state[2] = random();
thread->throttle_latency_skipped = 0;
thread->latency_late = 0;
nclients_dealt += thread->nstate;
if (is_latencies)
{
/* Reserve memory for the thread to store per-command latencies */
@ -3395,6 +3403,9 @@ main(int argc, char **argv)
}
}
/* all clients must be assigned to a thread */
Assert(nclients_dealt == nclients);
/* get start up time */
INSTR_TIME_SET_CURRENT(start_time);