ホームページ > バックエンド開発 > PHPチュートリアル > 同時実行性が高い場合、Apache が頻繁に再起動する

同時実行性が高い場合、Apache が頻繁に再起動する

WBOY
リリース: 2016-06-23 13:41:19
オリジナル
1297 人が閲覧しました

いくつかのサーバーはすべて Windows 2008 システムです
各サーバーの Apache の最大同時実行数は ThreadsPerChild 1000 に設定しました
最近、元のプログラムを最適化するために、マルチスレッドを記述する必要があります (php は Apache のマルチスレッドを使用します)実装) 長時間実行されるプログラムの場合、スレッド数は 50 です。
これらの長時間実行プログラムは、最大 1 時間実行されると一律に停止することがわかりました。原因を長い間調べた結果、プログラムが停止するときに「子プロセスが終了しました」というメッセージが表示されることがわかりました。 Apacheのエラーログにstatus 255 -- Restarting.」と表示されると、Apacheが自動的に再起動します。
そこで、各サーバーの Apache のエラー ログを確認したところ、サーバーの同時実行数が高くなるほど、Apache がより頻繁に再起動されることがわかりました。同時実行数が約 200 の 1 つのサーバーは、実際に数分ごとに再起動しました。
その後、1 つのスレッドを使用して長時間実行プログラムを実行しようとしましたが、1 日後に 50 スレッドに切り替えた後、1 時間以内に再び停止しました。
すでに混乱しています。Apache の設定は複数のポートと同時実行のみを設定しており、残りはオリジナルの設定です。見落としている重要な設定はありますか?
しばらくオンラインで検索しましたが、適切な解決策がありません。一緒に分析して議論しましょう
「子プロセスがステータス 255 で終了しました -- 再起動中です。」Apache が再起動する問題を解決するにはどうすればよいですか?
PHP がプログラムを長時間実行し、Apache が自動的に再起動した場合に自動的に回復する方法は?


ディスカッションへの返信 (解決策)

httpd.conf ファイルをこのように変更すると、一般的なボトルネックは mysql にあると思います。それでもうまくいかない場合は、思い切って nginx に変更してください。私も少し前はそうでしたが、今は nginx を使っていてとても満足しています。

<IfModule prefork.c>    StartServers           5    MinSpareServers        5    MaxSpareServers        10    ServerLimit            2000    MaxClients             1500    MaxRequestsPerChild    1000</IfModule>
ログイン後にコピー

子プロセスはステータス 255 で終了しました -- 再起動中です
子プロセスの終了ステータスは 255?? 再起動します

Windows の PHP はスレッドをサポートしません

fsockopen を通じてシミュレートすると、アクティブに開始された httpプロセス 。 Apache の場合、これはブラウザによって開始されるものと何ら変わりません
同時 http リクエストが Apache の事前設定された同時実行数を超えた場合、キューイングのみが発生しますが、クラッシュは発生しません
もちろん、同時実行数に応じてメモリが必要です保証されています。メモリ不足、クラッシュは当然です

さらに、http レスポンダーが長時間出力しない場合、Apache はハングします。これは Apache の問題ではなく、対応するプログラムの問題です

httpd.conf ファイルをこのように変更する場合、一般的なボトルネックは mysql にあると思います。それでもうまくいかない場合は、思い切って nginx に変更してください。私も少し前はそうでしたが、今は nginx を使っていてとても満足しています。


ありがとうございます。これまで nginx を使用したことがなかったので、試してみることにしました

あなたが Windows システムを使用していることに気づきませんでした。おそらくモデレータが正しいでしょう。

子プロセスはステータス 255 で終了しました -- 再起動中です
子プロセスの終了ステータスは 255?? 再起動しています

Windows の PHP はスレッドをサポートしていません

fsockopen を通じてシミュレートする場合、それはアクティブに開始された http プロセスです。 Apache の場合、これはブラウザによって開始されるものと何ら変わりません
同時 http リクエストが Apache の事前設定された同時実行数を超えた場合、キューイングのみが発生しますが、クラッシュは発生しません
もちろん、同時実行数に応じてメモリが必要です保証されています。メモリ不足、クラッシュは当然です

さらに、http レスポンダーが長時間出力しない場合、Apache はハングします。これは Apache の問題ではなく、対応するプログラムの問題です


私は fsockopen シミュレーションを通じてこれを達成しました。
Apache エラーが発生する場合、タスク マネージャーのメモリが不足していることが原因ではないことをしばらく監視していました。
出力するようにとネットで読んだので、以下も出力しました
echo ' ';//一个空格ob_flush();flush();
ログイン後にコピー

出力は正しく書かれていますか? 「出力バッファの内容をフラッシュする」という文を追加する必要があるかどうかはわかりませんが、出力内容がバッファに保持されると問題が発生すると思います。正してください。

あなたが Windows システムを実行していることに気づきませんでした。おそらくモデレータの言うことは正しいでしょう。


Windows版もあるようなので、とりあえず確認してみます。
本当に機能しない場合、唯一の選択肢は全体として Linux に切り替えることです。つまり、それに応じて変更する必要がある項目がさらに多くなります。

php は Linux 上で動作します。基本的には大きく変える必要はありません。対応するファイルの大文字と小文字に注意してください。

Windows 環境の場合は、fsockopen を使用して動作をシミュレートすることをお勧めします。

現時点では、Apache または nginx を使用し続けることができます。たとえ Win 上の問題が一時的に解決されたとしても、次のピットが待っています。また、それはあまりにも残酷です...
しかし、システムがますます大きくなるにつれて、ますます多くのトラブルが発生し、以前の経験不足によって残された隠れた危険の代償を払わなければならないことは事実です。

昨日、一時的な解決策を考えて、長時間操作がないとマルチスレッドが再起動されるように監視プログラムを書きました(プログラムが長時間実行されると、基本的にはapacheの再起動が原因なので、そのままフォローして再起動するだけのようです。

今日観察してみたら、かなり安定していることが分かり、やっと安心しました。
次に、最も単純なプログラムを使用して、同時実行中に Apache が再起動し続けるかどうかをテストしてみます。まず問題の特徴を明らかにしてから、プログラムの問題を解決するか、環境を変更するかを決定します。



確認すると、Apache の問題であるはずです。
Windowsのnginxには、1つのアクセスが完了しないと他のアクセスが実行できないという問題があり、実行に時間がかかるプログラムを書かなければなりません。

環境問題に関してはどうすることもできませんが、現状では、たとえこれが落とし穴だったとしても、Linux に投資することが最大の希望のようです。

皆さんありがとうございます、先にスレッドを閉じさせていただきます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート