[AWS] Confirm Apache Bench "weirdness"

Thomas Løcke thomas.granvej6 at gmail.com
Wed Feb 2 09:40:38 CET 2011


Hey all,

I've grabbed the C source for Apache Bench, and as far as I can see,
there is a problem with how the total amount of received bytes are
counted.

Here's the source: http://pastebin.com/pgmdZGmK

The three important variables are:

    int requests = 1;       /* Number of requests to make */
    apr_int64_t totalbread = 0;   /* totoal amount of entity body read */
    int done = 0;              /* number of requests we have done */

"totalbread" is the variable used in the "HTML transferred" output,
and "done" is the "Complete requests".

"done" is increased whenever a connection has finished, and
"totalbread" is increased with the size of the body received. The
funny thing is that, as far as I can see, every time "done" is
increased, it happens behind a guard like this:

    if (done < requests) {

OTOH "totalbread" is simply increased when there's data on the socket:

    else {
        /* outside header, everything we have read is entity body */
        c->bread += r;
        totalbread += r;
    }

But why does Apache Bench connect to AWS more than "requests" amount
of times? Well, in the test() function we see this:

    /* initialise lots of requests */
    for (i = 0; i < concurrency; i++) {
        con[i].socknum = i;
        start_connect(&con[i]);
    }

And in start_connect() we have this:

    if (!(started < requests))
    return;

Which appears to be a guard against starting too many requests, but
seeing as "started" is only increased at the very end of the
start_connect() function:

    /* connected first time */
    set_conn_state(c, STATE_CONNECTED);
    started++;

and new connections are started as soon as a connection is closed, as
can be seen in close_connection():

    /* connect again */
    start_connect(c);
    return;

There might very well arise a race condition if the server is _very_
fast, so that "magic" stuff can happen between the "if"(!(started <
requests))" guard and the "started++;" call.

Does this sound plausible, and if so, would it be possible to fix this
annoyance in Apache Bench? Or is it simply the nature of the beast?

:o)
Thomas Løcke


More information about the AWS mailing list