web-dev-qa-db-ja.com

Apacheが応答しない/時々ストールする

私はApachehttpサーバー2.4をPHP 7.0およびDebianGNU/Linux 8(jessie)上のMySQL 5.5で実行しています)。時折、Apacheが数秒間(約30秒以上)完全に応答しなくなります。今回は、リクエストがキューに入れられているように見えます。Apacheがようやく正常に動作し始めると、積み重なった多くのリクエストを一度に処理する必要がありますが、これもそれほど良いことではありません。

Apacheが応答しなくなる理由は、次の理由で不明です。

  • CPU負荷が完全に低下します。 ApacheもMySQLも他のものもCPUを特に使用していません
  • Apacheerror_logにエラーはありません
  • MySQLにはブロッキングクエリはありません-「SHOWPROCESSLIST」と入力しても何も表示されません
  • 1秒に1回、「内部ダミー接続」がaccess_logに表示されます
  • これが発生するためには、サーバーの全体的な負荷が高くてはなりません。システムにログインしているユーザーが少なく、負荷が平均を下回っている場合でも、これが発生する可能性があります
  • PHP echo "Hello World!";のみを含むスクリプトでも実行されません
  • PHPでは、MySQLエラーはスローされず、MySQLコンソールからMySQLステートメントを簡単に実行できます。
  • 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を使用してログに記録した行の意味を誰かが説明したり、問題を分析するための別の方法を提案したりできますか?

2
toastbrot888

straceで、ブロックしているファイル番号を確認できます。 _ls -l /proc/$pid/fd_を実行すると、そのプロセスで開いているすべてのファイルが表示されます。 file-numberのシンボリックリンクは、問題のファイルを指します。

私はそのような問題を見てきました、通常この問題を抱えているのはセッションファイルです。セッションファイルの場合は、開発者にPHPのsession_write_close()が何をするのか、そしてsession_write_close()を省略すると負荷がかかった状態でパフォーマンスに何が起こるのかを理解させます。

2
Andreas Rogge

fcntlは、ファイル記述子を設定しようとしているカーネルです。焦点を当てていないことの1つは、ディスクの入出力待機時間です。したがって、iostatまたはmpstatを実行して、問題が発生したときにディスクパフォ​​ーマンスの問題があるかどうかを確認します。

0
Raman Sailopal