2014年3月25日火曜日

abの出力の確認 : Failed requests

前回の計測で、Failed requestsの発生した計測結果(Keep-Aliveを有効にしたevent MPM)を確認する。

abの出力を確認する。

Document Length:        31 bytes

これは、最初に読み込んだコンテンツサイズを保持している。

Complete requests:      1000000
Failed requests:        172849
   (Connect: 0, Receive: 0, Length: 172849, Exceptions: 0)

Failed requestsはComplete requestの内数(Complete requestsに含まれる)。
Lengthエラーは、読み込んだ(ボディ)サイズが、Document Lengthと一致しない場合だ。

print文を入れて見てみると、読み込んだサイズは0。
コネクションが終了しているらしい。これがLengthエラーとしてカウントされている。
サーバで接続を切っているということになるだろう。

 $ ab -c 10 -n 100 -k http://centps5:8080/hello.html


で試すと、サーバのアクセスログの出力件数は、
Complete requests - Failed Requests
になっている。

サーバは、リクエストを受け取らないで接続を切っているのかもしれない。

ソースを確認した。

(httpd-2.4.7/server/mpm/event/event.c)

   1368 static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy)
   1369 {
    :

   1414     for (;;) {
    :

   1495         while (num) {
   1496             pt = (listener_poll_type *) out_pfd->client_data;
   1497             if (pt->type == PT_CSD) {
   1498                 /* one of the sockets is readable */
    :

   1502                 switch (cs->pub.state) {
   1503                 case CONN_STATE_CHECK_REQUEST_LINE_READABLE:
   1504                     cs->pub.state = CONN_STATE_READ_REQUEST_LINE;
   1505                     remove_from_q = &keepalive_q;
   1506                     /* don't wait for a worker for a keepalive request */
   1507                     blocking = 0;
   1508                     /* FALL THROUGH */
   1509                 case CONN_STATE_WRITE_COMPLETION:
   1510                     get_worker(&have_idle_worker, blocking,
   1511                                &workers_were_busy);
    :

   1532                     /* If we didn't get a worker immediately for a keep-alive
   1533                      * request, we close the connection, so that the client can
   1534                      * re-connect to a different process.
   1535                      */
   1536                     if (!have_idle_worker) {
   1537                         start_lingering_close_nonblocking(cs);
   1538                         break;
   1539                     }
    :


1510行目のget_worker()で利用可能なworkerスレッドが得られない場合(have_idle_workerが0)に、
1537行目でソケットを閉じている。
1532行目のコメントにもあるように、keep-aliveなリクエストに対してworkerスレッドが確保できなければ、直ちに接続を切り、クライアント側が再接続するのを待つという仕様になっている。

高負荷では、空きworkerスレッドが得られないことがあるため、abでの負荷検証では、接続が切られるケースが出てくることになったと考えられる。

abが、このエラーの分を余分にリクエスト投げるようになっていれば、他のFailed requestsの発生していない計測と同等の条件になるということか。どうだろう。


メモ


前回と同様な負荷をかけた場合には、サーバのアクセスログに記録されるリクエスト件数は
Complete requests - Failed Requests にはならず、少し多い。
event MPMでKeep-Aliveを有効にした場合、検証ではネットワークも限界に近くなっているので、そちらが原因ということも考えられるが、確認できていない。



0 件のコメント:

コメントを投稿