2017-01-12 4 views
9

私は/ server-statusを使用してApacheプロセスを監視しています。起動すると、彼らは次のようになります。多くの長時間実行されているApacheプロセスは、一定時間が経過しても要求のないREAD状態にある

_____W_K__K____________C_K________C_____________W_.............. 
................................................................ 
................................................................ 

しかし、このような外観を実行しているの数時間後:

R_KCR___KR__RKRR_RRRKRRRRRRKRR_RRCK____R_RRRR_RRRKRRRKRRRRRRRRR_ 
R_RRRR_R.RR.R_R.R_R..CKRRRRW.K_RCRKRR_R_.._R._.RK_KRK_.RRR.KK_.R 
..RR............................................................ 

長い時間と私ドンを取った、あまりにも多くの「読む」(R)のステータスがあります彼らには何の要求もないので、彼らは何をしているのか分からない。 (追加があることを言及Iは、上記の例からスキップ状態を、合計で私が利用可能な2000個の位置を持っている「」)プロセス一覧で私はこのような約40 『R』プロセス1:

Srv PID Acc  M CPU SS Req Conn Child Slot Client  VHost Request 
15-2 21291 0/37/11158 R 0.03 7468 2 0.0 1.93 198.35 82.78.95.105 

このようなレポートのヘッダーを見て:4X3.6GHZ Xeonプロセッサ、2X512 GB SSD、32ギガバイトのメモリ、Debianの3.16.36-1は、Apache 2.4.10、PHP 5.6:

Server Version: Apache/2.4.10 (Debian) mod_fcgid/2.3.9 OpenSSL/1.0.1t 
Server MPM: prefork 
Server Built: Sep 15 2016 20:44:43 
Current Time: Thursday, 12-Jan-2017 08:38:46 EET 
Restart Time: Wednesday, 11-Jan-2017 00:51:18 EET 
Parent Server Config. Generation: 3 
Parent Server MPM Generation: 2 
Server uptime: 1 day 7 hours 47 minutes 27 seconds 
Server load: 0.34 0.35 0.39 
Total accesses: 1599556 - Total Traffic: 29.9 GB 
CPU Usage: u18.87 s6.81 cu0 cs0 - .0224% CPU load 
14 requests/sec - 274.0 kB/second - 19.6 kB/request 
90 requests currently being processed, 27 idle workers 

は、私がプライベートサーバーを持っています。 29、mod_fcgid、php-fpm、php5-cgi、prefork。

私apache2.confの設定の一部:

Timeout 14400 
KeepAlive On 
MaxKeepAliveRequests 1000 
KeepAliveTimeout 3 
HostnameLookups Off 

マイmpm_prefork.conf設定:

<IfModule mpm_prefork_module> 
    StartServers 50 
    MinSpareServers 25 
    MaxSpareServers 50 
    ServerLimit 2000 
    MaxRequestWorkers 2000 
    MaxConnectionsPerChild 1000 
</IfModule> 

私fcgid.confの設定の一部:

FcgidMaxRequestLen 1073741824 
FcgidOutputBufferSize 1073741824 
FcgidMaxProcesses 200 
FcgidMaxProcessesPerClass 100 
FcgidMinProcessesPerClass 0 
FcgidProcessLifeTime 30 
FcgidConnectTimeout 30 
FcgidIOTimeout 14400 
FcgidBusyTimeout 14400 
FcgidIdleTimeout 3 
FcgidIdleScanInterval 1 

私が持っているいくつかのサーバーで長時間実行しているcronジョブを処理しているので、ApacheとPHPプロセスでこの「14400」(= 4時間)という大きなタイムアウトが必要です。

質問:

  1. 非常に多くの "R" のステータスが要求することなく、あるのはなぜ?
  2. 彼らは何をしていますか、どうやって調べることができますか?
  3. なぜそれほど長い時間がかかるのですか?

アップデート1:

Aは、これは私が私のcronジョブを実行することができますするための最小値である、(= 2時間)7200にタイムアウトを変更しました。しかし私は私のcronjobsに問題がなかった。

Apacheのも
FcgidIOTimeout 7200 
FcgidBusyTimeout 7200 

PHP and mod_fcgid: ap_pass_brigade failed in handle_request_ipc functionに基づいて
Timeout 7200 

私はこれでした:数時間後

FcgidMaxRequestsPerProcess 500 

:私はこれをしなかったmod_fcgid: ap_pass_brigade failed in handle_request functionに基づいて

FcgidOutputBufferSize 0 

をサーバーが応答を停止:

サービスは利用できません:サーバーが一時的maintananceのダウンタイムや容量の問題にあなたの 要求をサービスすることができません。後で にもう一度お試しください。

[fcgid:warn] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function 
[fcgid:warn] (32)Broken pipe: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function 

そして、この(多分、各要求のための)のようなの束:

[fcgid:warn] mod_fcgid: too much processes, please increase FCGID_MAX_APPLICATION 

質問2:

私はこの2のようないくつかのerrosを発見したログに

  1. これらのエラーは何を意味していますか?どうすれば修正できますか?
  2. サーバーが応答しなくなるのはなぜですか?おそらくエラーのため...
  3. mod_fcgid、php-fpm、php5-cgi、preforkモジュールは完全に互換性があり有効ですか?これは、新しいサーバーを入手したときのデフォルト構成でした。
+2

ここで重要なのはあなたのコメントです "私はサーバーに長時間走っているcronジョブを持っているので、これはApacheとPHPプロセスで14400(= 4時間)の大きなタイムアウトが必要な理由です。"それらを止めなさい、問題は持続するか。 lsofのようなコマンドは、それらの子のアクティブな接続を表示します。また、別の注意点として、mod_fcgidを持っていれば、preforkは必要なく、よりスケーラビリティの高いスレッドのようなmpmイベントに切り替えることができます。開いているスロットにはあなたのスペアサーバーディレクティブが反映されます。 OPTIONSリクエストはあなたのものからのもので、Apacheはそれ自体をpingしません。 –

+1

いずれの場合も、タイムアウトを通常の値に減らすと、この動作は停止します。 –

+1

あなたのPHPスクリプトは何らかの理由でmod_fcgidが、 "FCGID_MAX_APPLICATION"がソースと再コンパイル時に変更できる内部テーブルであるため、さらに多くのプロセスを生成できないため、そこにぶら下がっています。どのバージョンのmod_fcgidを使用していますか?もし最後でなければアップグレードするべきです。私のお勧めですか? mod_proxy_fcgi - > php-fpmに移行すると、mpm_eventでApacheを使用でき、php-fpmは非常に汎用性があり、非常に異なる独立した設定が可能です。 –

答えて

5

問題を解決しました。

ソリューションは、私は長いPHPスクリプトを実行するために実現したよう(偶数時間)15のような数にApacheのTimeout値を下げることでした絶頂になるこのタイムアウトする必要はありません、それはそのPHPのmax_execution_time enoughtています十分に大きくなる。

更新

私はまた、PHP-FPMの下でのFastCGIとPHP 7.1にアップグレードした、とesra-sが示唆したように、私はイベントにApacheのMPMモードを変更した、そしてそれは地獄のように実行されます。どうもありがとう!

+0

これについて詳しく説明できますか?あなたはPHP 7.1がApacheのイベントmpmの下で動作するようになり、スレッドセーフであると言っていますか? –

関連する問題