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