4月 14th, 2010

Apache2.2 gracefulバ゜

Posted in Apache by admin

 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

You can leave a comment, or trackback from your own site. RSS 2.0

Leave a comment