私はApachehttpサーバー2.4をPHP 7.0およびDebianGNU/Linux 8(jessie)上のMySQL 5.5で実行しています)。時折、Apacheが数秒間(約30秒以上)完全に応答しなくなります。今回は、リクエストがキューに入れられているように見えます。Apacheがようやく正常に動作し始めると、積み重なった多くのリクエストを一度に処理する必要がありますが、これもそれほど良いことではありません。
Apacheが応答しなくなる理由は、次の理由で不明です。
echo "Hello World!";
のみを含むスクリプトでも実行されませんRAMは問題ないようです-スワップパーティションはあまり使用されていません。これは、ストール中にtop
が言うことです。
KiB Mem: 6129344 total, 5975748 used, 153596 free, 24 buffers
KiB Swap: 1952764 total, 199428 used, 1753336 free. 4397256 cached Mem
Straceを使用して問題を分析しようとしました。正確には、サーバーが応答しなくなったことに気付いたときに、シェルに入ります。
ps auxw | grep Apache | awk '{print" -p " $2}' | xargs Sudo strace
この時間の間に、次のような行がstrace出力に頻繁に表示されますが、問題がない場合は表示されません:
[pid 13521] fcntl(57, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = -1 EAGAIN (Resource temporarily unavailable)
通常、問題がない場合は、次のような行が表示されます。
[pid 3414] fcntl(55, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
これが意味することを誰かが知っていますか?ある種のロックの競合があるように私には思えます...
完全を期すために、これが私のApache構成です。
LogFormat "%h PID %P %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" %V" common
ServerTokens ProductOnly
ServerSignature Off
TraceEnable off
<IfModule mod_ssl.c>
SSLHonorCipherOrder On
SSLProtocol ALL -SSLv2 -SSLv3
SSLCipherSuite EECDH+AES:AES256-SHA:AES128-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH:!EXP:!SRP:!DSS:!LOW;
SSLVerifyClient none
SSLVerifyDepth 1
SSLInsecureRenegotiation Off
</IfModule>
ScriptAlias /cgi-bin52/ /usr/share/phpcgi/php52/
ScriptAlias /cgi-bin53/ /usr/share/phpcgi/php53/
ScriptAlias /cgi-bin54/ /usr/share/phpcgi/php54/
ScriptAlias /cgi-bin55/ /usr/share/phpcgi/php55/
ScriptAlias /cgi-bin56/ /usr/share/phpcgi/php56/
ScriptAlias /cgi-bin70/ /usr/share/phpcgi/php70/
Mutex flock
LoadModule deflate_module /usr/lib/Apache2/modules/mod_deflate.so
LoadModule status_module /usr/lib/Apache2/modules/mod_status.so
AcceptFilter http none
AcceptFilter https none
ExtendedStatus on
TimeOut 60
KeepAlive Off
MaxKeepAliveRequests 50
KeepAliveTimeout 2
Options Indexes MultiViews FollowSymLinks
MaxRequestWorkers 256
MaxRequestsPerChild 300
ご覧のとおり、ロック動作に関連するエントリがすでにあります:Mutex flock
...安定性の理由から、私のWebhosterによって事前設定されています。また、 https://httpd.Apache.org/docs/2.4/mod/core.html#mutex では、これは問題のない数少ないオプションの1つであるようです。
解決策を見つけようとしているときにAcceptFilter
エントリを追加しましたが、成功しませんでした。
fcntl ...
を含むstraceを使用してログに記録した行の意味を誰かが説明したり、問題を分析するための別の方法を提案したりできますか?
strace
で、ブロックしているファイル番号を確認できます。 _ls -l /proc/$pid/fd
_を実行すると、そのプロセスで開いているすべてのファイルが表示されます。 file-numberのシンボリックリンクは、問題のファイルを指します。
私はそのような問題を見てきました、通常この問題を抱えているのはセッションファイルです。セッションファイルの場合は、開発者にPHPのsession_write_close()
が何をするのか、そしてsession_write_close()
を省略すると負荷がかかった状態でパフォーマンスに何が起こるのかを理解させます。
fcntlは、ファイル記述子を設定しようとしているカーネルです。焦点を当てていないことの1つは、ディスクの入出力待機時間です。したがって、iostatまたはmpstatを実行して、問題が発生したときにディスクパフォーマンスの問題があるかどうかを確認します。