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 件のコメント:
コメントを投稿