- PR -

ApacheBenchの結果の見方

1
投稿者投稿内容
cyanberry
常連さん
会議室デビュー日: 2005/01/07
投稿数: 37
投稿日時: 2005-06-24 18:08
しょうもない質問かもしれませんが、どこを調べても載っていなかったので、ここで質問させていただきます。

ApacheBenchの結果の一部に下記のようなものがあります。

-------------------------------------------------
Complete requests: 30000
Failed requests: 29990
(Connect: 0, Length: 29990, Exceptions: 0)
-------------------------------------------------

この「Failed requests」についての質問なのですが、これが「取りこぼした数」ということは分かったのですが、括弧の中の意味が分かりません。
予想では、

Connect・・・接続できた数?
Length・・・リクエストの何かの長さ?
Exceptions・・・Exceptionがでた数?

と思っているのですが、決定的な情報がありません。
ご存知の方、ご教授の程よろしくお願いいたします。

また、上記の例だと30000リクエスト投げて、29990件とりこぼしってことになるのですが、これはDBに書き込む処理なのですが、書き込み件数は30000件正常に書き込まれています。
この場合リクエストを受け付けたけど、レスポンスを返せなかったのが29990件ということになるのでしょうか?
いつも、ConnectとExceptionsは0件ですが、Lengthは大量に出てきますので、気になっています。

合わせて、よろしくお願いいたします。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-06-25 10:25
Failed requestsの詳しい説明って、man ab にはないですね。

興味を持ったのでちょっと調べてみました。

/support/ab.cをちょっと眺めてみると:

「Failed requests」の表示から、使っている変数 err_length, err_except だと判ります

コード:
    printf("Failed requests:        %ld\\n", bad);
    if (bad)
	printf("   (Connect: %d, Length: %d, Exceptions: %d)\\n",
	       err_conn, err_length, err_except);



err_lengthを探すと、切断時に、実際に読み込んだ長さ(c->bread)とdoclenが異なるとき
にカウントされるのが判ります。breadはHTTP Entity BodyあるいはHTTP Message Bodyの
いずれかの長さだと思うのですが、そこらへんは追いかけていません。
(メッセージボディとエンティティボディ)

コード:
static void close_connection(struct connection * c)
{
    if (c->read == 0 && c->keepalive) {
        /*
         * server has legitimately shut down an idle keep alive request
         */
        if (good)
            good--;             /* connection never happened */
    }
    else {
        if (good == 1) {
            /* first time here */
            doclen = c->bread;
        }
        else if (c->bread != doclen) {
            bad++;
            err_length++;
        }



コード:
struct connection {
    apr_pool_t *ctx;
    apr_socket_t *aprsock;
    int state;
    apr_size_t read;            /* amount of bytes read */
    apr_size_t bread;           /* amount of body read */



err_exceptは、APR (Apache Portable Runtime)でエラーが起きたことを示しているようです。

コード:
    status = apr_recv(c->aprsock, buffer, &r);
    if (APR_STATUS_IS_EAGAIN(status))
        return;
    else if (r == 0 && APR_STATUS_IS_EOF(status)) {
        good++;
        close_connection(c);
        return;
    }
    /* catch legitimate fatal apr_recv errors */
    else if (status != APR_SUCCESS) {
        err_except++; /* XXX: is this the right error counter? */
        /* XXX: Should errors here be fatal, or should we allow a
         * certain number of them before completely failing? -aaron */
        apr_err("apr_recv", status);
    }


cyanberry
常連さん
会議室デビュー日: 2005/01/07
投稿数: 37
投稿日時: 2005-06-27 11:08
ちいにぃさん詳しい回答有難うございます!大変参考になりました。
ab.cがソースになってるんですね。私もそこから追っかけてみたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)