Apache2.2 gracefulバ゜
Apache2.2系のうち、2.2.11以? のバージョンでは、2つ以上のポートをListenしマルチプロセス? prefork)で? 行している場合に「graceful」「graceful-stop」が正常に動作しないというバグがありました。( https://issues.apache.org/bugzilla/show_bug.cgi?id=42829 )psコマンドぜ httpdプロセスを監? していると「graceful」を実行した瞬間、子プロセスが<defunct>に? 瞬で? ゜ るのが確? できます。このバグは、2.2.12でフィックスしたぜ CHANGELOGに? されています。
*) prefork: Fix child process hang during graceful restart/stop in configurations with multiple listening sockets. PR 42829. [JoeOrton, Jeff Trawick]
更ぜ Apache2.2.15をインストールする機会があったので「graceful」を実行してみたところ、2.2.11以? のバージョンと同様に以下のようにエラーログ出力することが゜ かりました。
[error] (9)Bad file descriptor: apr_socket_accept: (client socket)
出力頻度ぜ 2.2.11以? のバグのように常に出力する゜ けではなぜ 、5回ぜ 1回のペースぐらいに朸 っている印象でした。子プロセス数? StartServers)を1に設定し、gdbで圭 プロセスにアタッチしたところ以? の部分までトレースできました。
Program received signal SIGUSR1, User defined signal 1. [Switching to Thread 46912524354064 (LWP 29198)] 0x00002aaaac315763 in __epoll_wait_nocancel () from /lib64/libc.so.6 (gdb) cont Continuing. (gdb) where #0 log_error_core (file=0x5555555ba00b "unixd.c", line=636, level=3, status=9, s=0x555562dfa860, c=0x0, r=0x0, pool=0x0, fmt=0x5555555ba408 "apr_socket_accept: (client socket)", args=0x7fffdca5ded0) at log.c:519 #1 0x000055555559b4fb in ap_log_error (file=0x5555555ba00b "unixd.c", line=636, level=3, status=9, s=0x555562dfa860, fmt=0x5555555ba408 "apr_socket_accept: (client socket)") at log.c:715 #2 0x00005555555b0e0b in unixd_accept (accepted=0x7fffdca5e040, lr=0x555562df1b40, ptrans=0x555562f2db58) at unixd.c:636 #3 0x00005555555ae82e in child_main (child_num_arg=0) at prefork.c:643 #4 0x00005555555aea6f in make_child (s=0x555562dfa860, slot=0) at prefork.c:758 #5 0x00005555555af1ad in ap_mpm_run (_pconf=0x555562df3138, plog=0x555562e252c8, s=0x555562dfa860) at prefork.c:1058 #6 0x000055555557b7bf in main (argc=8, argv=0x7fffdca5e368) at main.c:740
01 server/main.c 02 main() 03 server/mpm/prefork/prefork.c 04 ap_mpm_run() 05 make_child() 06 child_main() 07 status = lr->accept_func(&csd, lr, ptrans); 08 os/unix/unixd.c 09 unixd_accept() 10 status = apr_socket_accept(&csd, lr->sd, ptrans); 11 srclib/apr/network_io/unix/sockets.c 12 apr_socket_accept() 13 s = accept(sock->socketdes, (struct sockaddr *)&sa.sa, &sa.salen); 14 os/unix/unixd.c 15 unixd_accept() 16 ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf,"apr_socket_accept: (client socket)");
07行目ぜ lr->accept_func関数のエラー? socket関数がディスクリプタ? ? “EBADF”を返す)を元にエラーボ ンドリングされてログ出力されていますが、graceful処理の場合はこの時点ですでにソケットが閉じられていますのぜ accept出来ません。
この問題は、以? のように新たなバグとして登録されています。パッチではソケットがアクティブでなければ? !lr->active)、Errorレベルのログではなぜ 、Debugレベルのログとして出力されるように修正しているようです。(2010? 4月14日現在?
https://issues.apache.org/bugzilla/show_bug.cgi?id=42829
Comments are closed!