ApacheBenchの報告と実リクエスト数の差異

Apacheのabコマンド(ApacheBench)でべらぼうな数(n件)のリクエストをべらぼうな多重度(-cオプション)で発行してみたら、ab先生が「n件終わったよ!」と報告してくるにも関わらず、実際にリクエストを受けたサーバのaccess_logをみるとn+α件分のログが残っていたりする。
どういうこっちゃと思ってab先生のソースを覗いて見たところ、以下のようになっていた。

static void start_connect(struct connection * c)
{
    apr_status_t rv;

    if (!(started < requests))
    return;

……略(apr_socket_createとかいろいろ)……

    started++;
#ifdef USE_SSL
    if (c->ssl) {
        ssl_proceed_handshake(c);
    } else
#endif
    {
        write_request(c);
    }
}

変数startedに開始したコネクション数、変数requestsに上記nが入ってる。数の確認と増加の処理がatomicではないのでザクザク動かした場合に隙間に余分なものが入っちゃうってことですね。了解。
単純に負荷をかけるだけでなくそこらへんを気にするようなケースでは、abコマンドじゃなくてちゃんとしたのを使いなさいという話ですかね。

……ん?ちがうな。マルチスレッドじゃなくてpoll/selectで動いてるから隙間は関係ないか。
何が原因じゃろ。