1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Make pgbench use erand48() rather than random().

glibc renders random() thread-safe by wrapping a futex lock around it;
testing reveals that this limits the performance of pgbench on machines
with many CPU cores.  Rather than switching to random_r(), which is
only available on GNU systems and crashes unless you use undocumented
alchemy to initialize the random state properly, switch to our built-in
implementation of erand48(), which is both thread-safe and concurrent.

Since the list of reasons not to use the operating system's erand48()
is getting rather long, rename ours to pg_erand48() (and similarly
for our implementations of lrand48() and srand48()) and just always
use those.  We were already doing this on Cygwin anyway, and the
glibc implementation is not quite thread-safe, so pgbench wouldn't
be able to use that either.

Per discussion with Tom Lane.
This commit is contained in:
Robert Haas
2011-08-03 16:26:40 -04:00
parent ac36e6f71f
commit 4af43ee3f1
12 changed files with 40 additions and 62 deletions

View File

@ -36,5 +36,5 @@ geqo_rand(PlannerInfo *root)
{
GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
return erand48(private->random_state);
return pg_erand48(private->random_state);
}

View File

@ -64,9 +64,9 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy,
* Ensure we have selected different genes, except if pool size is only
* one, when we can't.
*
* This code has been observed to hang up in an infinite loop when the
* platform's implementation of erand48() is broken. We consider that a
* feature: it lets you know you'd better fix the random-number generator.
* This code was observed to hang up in an infinite loop when the
* platform's implementation of erand48() was broken. We now always
* use our own version.
*/
if (pool->size > 1)
{