私のApacheは複数のスレッドで頻繁にハングします。各プロセスは何時間もスタックします。バックトレースは次のようになります。
_(gdb) backtrace
#0 0x00002af60c22b2d7 in semop () from /lib64/libc.so.6
#1 0x00002af60bbf612c in ?? () from /usr/lib64/libapr-1.so.0
#2 0x000055555559e614 in ?? () from /usr/sbin/httpd2-prefork
#3 0x000055555559e9ea in ?? () from /usr/sbin/httpd2-prefork
#4 0x000055555559f25d in ap_mpm_run () from /usr/sbin/httpd2-prefork
#5 0x000055555557a080 in main () from /usr/sbin/httpd2-prefork
_
strace
を使用すると、すべてのApacheプロセスに接続するパイプを待機していることがわかります。
_strace -p 3069
....
read(7, 0x7fff16a04df7, 1) = -1 EAGAIN (Resource temporarily unavailable)
semop(286162952, 0x2af60bd07dc0, 1 <unfinished ...>
_
ここでApacheは何をしていますか?
これを引き起こしている原因をどのように理解できますか?
更新
コメントで要求されたデータ
_# ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x06347849 32768 root 666 65544 2
0x0c6629c9 21004289 root 640 1166952 2
0x3107040d 98306 root 666 131176 3
0x00000000 436994051 root 600 33554432 11 dest
0x01070756 191135748 root 664 4192 1
0x01070730 190349317 root 664 4192 1
0x01070736 190382086 root 664 4192 1
0x01070742 190414855 root 664 4192 1
0x01070746 190447624 root 664 4192 1
0x01070753 190545929 root 664 4192 1
0x0107075e 190611466 root 664 4192 1
0x01070750 191037451 root 664 4192 1
0x010706c8 21069838 root 664 4192 1
0x0107074d 191070223 root 664 4192 1
------ Semaphore Arrays --------
key semid owner perms nsems
0x0107000d 0 root 666 1
0x0107000e 32769 root 666 1
0x3107040d 98306 root 666 5
0x72070097 243433475 root 666 2
0x00000000 977469444 wwwrun 600 1
0x4d028007 262149 root 600 8
0x00000000 450166790 wwwrun 600 1
0x0107073f 1209401351 root 664 1
0x00000000 977502216 wwwrun 600 1
0x00000000 1208451083 root 600 1
0x01070751 1208582156 root 664 1
0x01070758 1208647693 root 664 1
0x00000000 1208680462 root 600 1
0x01070749 1209237519 root 664 1
0x0107074e 1209270289 root 664 1
0x00000000 1209303058 root 600 1
0x00000000 1209335827 root 600 1
0x00000000 1209434132 root 600 1
------ Message Queues --------
key msqid owner perms used-bytes messages
_
そして
_# ps auxwww | grep "Apache"
wwwrun 2708 0.0 0.5 201576 11972 ? S Nov11 0:05 /usr/sbin/httpd2-prefork -f /etc/Apache2/httpd.conf -DSSL
wwwrun 3607 0.0 0.6 202472 13388 ? S Nov11 0:06 /usr/sbin/httpd2-prefork -f /etc/Apache2/httpd.conf -DSSL
root 5798 0.0 0.7 200828 14800 ? Ss Nov08 0:00 /usr/sbin/httpd2-prefork -f /etc/Apache2/httpd.conf -DSSL
wwwrun 12926 0.0 0.5 201712 11768 ? S 08:19 0:00 /usr/sbin/httpd2-prefork -f /etc/Apache2/httpd.conf -DSSL
wwwrun 13009 0.0 0.6 202196 13340 ? S 02:19 0:05 /usr/sbin/httpd2-prefork -f /etc/Apache2/httpd.conf -DSSL
_
さらにいくつかのプロセスがありますが、イメージを取得します。
また、SuseServerです。
_# cat /proc/version
Linux version 2.6.16.60-0.74.7-default (geeko@buildhost) (gcc version 4.1.2 20070115 (SUSE Linux)) #1 Fri Nov 26 09:16:10 UTC 2010
_
httpd.conf
_# grep ^[^#] /etc/Apache2/httpd.conf
Include /etc/Apache2/uid.conf
Include /etc/Apache2/server-tuning.conf
ErrorLog /var/log/Apache2/error_log
Include /etc/Apache2/sysconfig.d/loadmodule.conf
Include /etc/Apache2/listen.conf
Include /etc/Apache2/mod_log_config.conf
Include /etc/Apache2/sysconfig.d/global.conf
Include /etc/Apache2/mod_status.conf
Include /etc/Apache2/mod_info.conf
Include /etc/Apache2/mod_usertrack.conf
Include /etc/Apache2/mod_autoindex-defaults.conf
TypesConfig /etc/Apache2/mime.types
DefaultType text/plain
Include /etc/Apache2/mod_mime-defaults.conf
Include /etc/Apache2/errors.conf
Include /etc/Apache2/ssl-global.conf
<Directory />
Options None
AllowOverride None
Order deny,allow
Deny from all
</Directory>
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
DirectoryIndex index.html index.html.var
Include /etc/Apache2/default-server.conf
Include /etc/Apache2/sysconfig.d/include.conf
Include /etc/Apache2/vhosts.d/*.conf
_
read(7 ,..)
はパイプを指します:
_# ls -la /proc/3069/fd/7
lr-x------ 1 root root 64 Nov 7 17:24 7 -> pipe:[157329520]
_
すべてのApacheプロセスを接続します。
_# lsof | grep 157329520
httpd2-pr 2430 root 7r FIFO 0,5 157329520 pipe
httpd2-pr 2430 root 8w FIFO 0,5 157329520 pipe
httpd2-pr 3061 wwwrun 7r FIFO 0,5 157329520 pipe
httpd2-pr 3061 wwwrun 8w FIFO 0,5 157329520 pipe
...
_
セマフォについて
_# ipcs -s -i 39452680
Semaphore Array semid=39452680
uid=30 gid=8 cuid=0 cgid=0
mode=0600, access_perms=0600
nsems = 1
otime = Mon Nov 19 09:47:05 2012
ctime = Sun Nov 18 11:15:04 2012
semnum value ncount zcount pid
0 0 5 0 14678
_
ncount
は常に_Apache2ctl status
_のアイドルワーカーの数と一致するため、semop全体が通常のidelワーカーであり、私の問題とは何の関係もないと思います。
あなたはまばらに知られている問題につまずいていると思います。 Linuxのバグのようで、セマフォア数はすでに0ですが、プロセスはそうでないかのように待機します。このバグのメカニズムはわかりませんが、ロードされたマシンでのみ発生するようです。
実行ipcs -s -i $SEM_ID
ここで、$ SEM_IDはsemop()に指定された最初の引数です。カウントが0であることが表示されます。これにより、問題がApacheではなくLinuxにあることが確認されます。値が0以外の場合、問題はApacheのコードにあります。
約2年間カーネルを更新していないようですが、それ以降は修正されている可能性があります。他の報告によると、epollパスの制限が1000であるため、Apacheは1000を超える「最大クライアント」設定を使用できません。
他の誰かがこのスレッドにつまずいた場合。
製品でOCSPステープリングの問題が発生し、すべての子プロセスがぶら下がっていましたsemop TCP接続が確立された後、TLSハンドシェイクが終了する前です。どうやらメインサーバーは待機していたようです。応答しないOCSPサーバーからのOCSPステープルの場合。また、クライアントは、自身の検証を待つためにTLSハンドシェイクにハングアップし続ける場合があります。