サーバー上の php-cgi.exe プロセスが多数存在し、CPU が 100% 占有される問題の解決方法

サーバー上の php-cgi.exe プロセスが多数存在し、CPU が 100% 占有される問題の解決方法

Windows 2003+IIS6 の fastcgi 構成ファイル fcgiext.ini を最適化して、php-cgi.exe プロセスの数と占有メモリのサイズを削減します。

fastcgi の方が isapi より優れていると聞いたので、サーバーにインストールしました。構成環境は、windows 2003+IIS6+fastcgi(FCGI)+PHP5.2.17 です。長い間観察した結果、FastCGI モードで動作する PHP は、ますます多くのメモリを占有することがわかりました。アクセス数がわずかに多い場合、php-cgi プロセスが N 個多くなります。同じ状況では、isapi モードを使用する場合よりも数百 MB 多く占有する可能性があります。私のサーバーには 2G のメモリしかなく、余裕がありません。

ネットで検索してみたところ、多くの人が同じ問題に直面していることがわかりました。 PHP 関係者によるより正式な説明は、php-cgi プロセスにはメモリ リークがないというものです。php-cgi は、各リクエストの終了時にスクリプトが使用するすべてのメモリをリサイクルしますが、オペレーティング システムに解放せず、次の PHP リクエストに対応するために保持し続けます。これはおそらく、メモリの断片化を減らすため、またはシステムからメモリを要求してそれをオペレーティング システムに解放するまでに要する制御不能な時間の問題を解決するために行われます。ただし、PHP リクエストが ftp や zlib などの大容量メモリ操作を時々使用すると、システム メモリの大きなブロックが php-cgi によって継続的に占有され、使用できなくなります。
この問題の解決策は、Web サーバー構成内の fastcgi 構成ファイル パラメータを最適化することです。

C:\WINDOWS\system32\inetsrv\fcgiext.ini ファイルでは、次のような php-cgi プロセス関連のパラメータを設定できます。

[種類]
php = PHP
[PHP]
実行パス=C:\php-5.3.8-nts-Win32-VC9-x86\php-cgi.exe
最大インスタンス数=100
インスタンス最大リクエスト数=10000
環境変数=PHP_FCGI_MAX_REQUESTS:10000
リクエストタイムアウト=600
アクティビティタイムアウト=900

上記の構成では、

ExePath は FastCGI パーサーのパスを指定します。
instanceMaxRequests は、各インスタンスが処理できるリクエストの最大数を指定します。
maxInstances は、起動できるインスタンスの最大数を指定します。
EnvironmentVars は、デフォルト値 10000 の環境変数 PHP_FCGI_MAX_REQUESTS を作成します。
requestTimeout は、リクエストのタイムアウトを 600 秒に指定します。
activityTimeout は、アクティビティ セッションのタイムアウトを 900 秒に指定します。
推奨値は次のとおりです。
最大インスタンス数=
この値をより小さい値に変更します

提案

512Mメモリの場合は、maxInstances=50に変更します。
1Gメモリの場合は、maxInstancesを80に変更します。
2Gメモリの場合は、maxInstancesを140に変更します。

再度修正
インスタンス最大リクエスト数=
この値をより小さい値に変更します

提案

512Mメモリの場合はInstanceMaxRequests=200に変更します。
1Gメモリの場合はInstanceMaxRequests=300に変更します。
2Gメモリの場合はInstanceMaxRequests=500に変更します。

変更後、IIS を再起動します。

instanceMaxRequests PHP_FCGI_MAX_REQUESTS これら 2 つのパラメータは、php-cgi プロセスが作成後に受け入れることができる PHP リクエストの最大数を決定します。lighttpd のデフォルト設定は 10000 です。つまり、この php-cgi プロセスは 10,000 件の PHP リクエストを受信すると終了し、すべてのメモリを解放し、管理プロセスによって再起動されます。これを、たとえば 100 に下げると、php-cgi の再起動サイクルが大幅に短縮され、時折発生する高メモリ操作によって発生する問題の影響時間も短縮されます。
maxInstances このパラメータは、起動できるインスタンスの最大数、つまり php-cgi.exe プロセスの数を指定します。これを、たとえば 100 に下げると、タスク マネージャーのプロセスには php-cgi.exe プロセスのみが存在するようになり、php-cgi.exe が占有するメモリの合計が大幅に削減されます。
現在使用しているサーバーは、Windows 2003 オペレーティング システム、4G メモリ、php-cgi.exe プログラムが 7 ~ 25M のメモリを占有しています。maxInstances 値を 300 に調整したところ、php-cgi.exe プロセスの総数と占有メモリが減りました。応答速度は以前よりはるかに速くなりました。最小調整値は、サイトへのアクセス数に基づいて決定できます。

Win2008 サーバー、fastCGI の完璧な設定チュートリアル

WIN2008 の IIS7 上で FASTCGI を使用して PHP-CGI.EXE を呼び出す場合、デフォルトではプロセスが 4 つしかありません。トラフィック量の多い Web サイトの場合、プロセス数の不足によるプロセス キューイングは非常に深刻です。解決策は次のとおりです。

32 ビット システム http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_x86.msi
64 ビット システム http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_amd64.msi

以下のツールをダウンロードし、以下のようにインストールしてください。

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客
修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

に追加

PHP_FCGI_MAX_REQUESTS = 10000

追加後、IIS を再起動せずにプロセス マネージャーで効果を確認できます。

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

設定値には達していないようですが、Webサイトを閲覧するとパフォーマンスの向上は明らかです。

修改WIN2008下IIS調用FASTCGI進程數! - 小三子 - 怪叟博客

メモリ使用量~~ 実際、Microsoft システムの欠点の 1 つは、クライアントなどのユーザー アプリケーションに十分なメモリを残すのではなく、サーバーのメモリ使用量をサービスによって最大限に使用しなければならないことです。

次の 2 つのパラメータを設定する価値があることをお知らせします。

InstanceMaxRequests: fastcgi プロセス (php-fcgi.exe) が処理できるリクエストの最大数。制限を超えるとリサイクルされます。デフォルト値は 200 です。

PHP_FCGI_MAX_REQUESTS: PHP自体が制御するリクエストの最大数。デフォルトは500です。

fastcgi を使用して cgi を実行する場合、php 自体でリクエストの最大数を制限することは絶対に望ましくありません。 !

したがって、PHP 自体がプロセスをリサイクルする機会がないように、InstanceMaxRequests が PHP_FCGI_MAX_REQUESTS 以下であることを確認してください。

マイクロソフトが何と言ったか見てみましょう:

ネイティブ PHP リサイクルが開始される前に、FastCGI が常に Php-cgi.exe プロセスをリサイクルするようにしてください。構成プロパティ instanceMaxRequests は、FastCGI プロセス リサイクルの動作を制御します。このプロパティは、リサイクル前に FastCGI が処理するリクエストの数を指定します。PHP にも同様のプロセス リサイクル機能があり、これは環境変数 PHP_FCGI_MAX_REQUESTS によって制御されます。instanceMaxRequests を PHP_FCGI_MAX_REQUESTS 以下の値に設定することで、ネイティブ PHP プロセス リサイクル ロジックが開始されないようにすることができます。

サーバー上の php-cgi.exe プロセスが多すぎて CPU 使用率が 100% になる問題の解決策

IIS サーバーを使用する場合、php-cgi.exe プロセスが多すぎることが多く、CPU が 100% 占有され、最終的には Web サイトの実行速度が低下したり、フリーズしたりします。IIS を再起動するとしばらくは問題ありませんが、しばらくするとこの状況が再発します。なぜこのようなことが起こるのでしょうか。また、どのように解決すればよいのでしょうか。最初は、常に手動で php-cgi プログラムを終了していました。一時的には問題を解決できますが、長期的な解決策ではありません。Baidu で検索したところ、この問題は一般的にプログラムの問題であることがわかりました。たとえば、プログラムが fastcgi を使用して PHP を実行し、プログラムによって設定された StartProcesses が 6 以上と大きすぎるなどです。以下は、サーバーの cup% を引き起こす過剰な php-cgi.ext の問題に対する私の解決策です。お役に立てば幸いです。ほとんどの場合、この問題は 4 番目の項目で発生します。

ソリューション参照:

1. システムディスクの容量を確認します。システム内に一時ファイルが多すぎないか確認してください。MySQL データベースの一時ファイルはデフォルトで c:/windows/temp に保存されるため、数万または数百万の小さなファイルが蓄積され、システム ディスクが圧迫されます。

del *.* すべてのファイルを削除する

上記のコマンドが十分でない場合は、次のコードを使用できます。

del /f /q /s tmp\*.*

2. PHP は広く使用されている動的スクリプト言語ですが、IIS には PHP 言語の組み込みサポートがないため、PHP を使用する必要がある場合は自分でインストールする必要があります。 PHP は CGI モードまたは ISAPI モードでインストールできます。ISAPI モードの方がパフォーマンスが高いため、ISAPI モードを使用することをお勧めします。

3. プログラムを変更できる場合は、プログラム構成ファイルの StartProcesses 値を 2 に減らして、状況が改善されるかどうかを確認することをお勧めします。

4. サーバーに問題がないか、攻撃現象が発生していないかを確認します。

以下もご興味があるかもしれません:
  • Linux Cron によるパラメータ付き PHP コードのスケジュール実行
  • ASP と PHP でページ生成のタイミングを計るためのアイデアとコード
  • Linux サーバー構成 PHP ファイルのダウンロード、中国語の文字化け、ダウンロード エラーの解決方法
  • PHP を使用して大きなファイルを分割してアップロードする問題を解決する方法
  • LinuxシステムにPHP7.3バージョンをインストールする
  • PHP ローカル外れ値係数アルゴリズム - ローカル外れ値係数 (LOF) アルゴリズムの具体的な実装分析

<<:  HTML入門チュートリアル HTMLタグ記号をすぐにマスター

>>:  FastApi+Vue+LayUIを使用してフロントエンドとバックエンドを分離するサンプルコード

推薦する

Docker で ElasticSearch をデプロイする方法

1. ElasticSearch とは何ですか? Elasticsearch も Java で開発さ...

nginx を使用して正規表現で指定された URL リクエストを傍受する方法

nginx サーバーnginx は、静的ファイルの処理に非常に効率的な優れた Web サーバーです。...

MySQL 8.0.13 zipパッケージのインストール方法について

MySQL 8.0.13 にはデフォルトでデータ フォルダがあります。このフォルダを削除する必要があ...

MySQL NULLデータ変換方法(必読)

MySQL を使用してデータベースをクエリし、左結合を実行すると、関連付けられたフィールドの一部に...

Vue nextTickの原理の分析

目次イベントループmiscroTask (マイクロタスク) UI レンダリング (重要なポイント)次...

フレックスレイアウトでコンテナ内のコンテンツを維持するためのソリューションの詳細な説明

モバイル側では、フレックスレイアウトが非常に便利です。デバイスの幅に応じてコンテナの幅を自動的に調整...

mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します

まず解決策を見てみましょう #------------mysql の root ユーザーに権限を付与...

Nginx で Basic Auth ログイン認証を設定する方法

nginx でファイルサーバーを構築することもありますが、これは一般に公開されていますが、サーバーが...

ウェブサイト製品設計の参考となるいくつかの原則

以下の分析は製品設計原則に関するものですが、そのほとんどはウェブサイト製品に基づいているため、ユーザ...

Alibaba Cloud Server ドメイン名解決手順 (初心者向けチュートリアル)

ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...

Layuiはログインインターフェース検証コードを実装します

この記事の例では、ログインインターフェース検証コードを実装するためのlayuiの具体的なコードを参考...

JavaScript を学ぶときに知っておくべき 3 つのヒント

目次1. 魔法の拡張演算子1. 配列をコピーする2. 配列を結合する3. オブジェクトを展開する2....

MySQL 永続統計の詳細な説明

1. 永続的な統計情報の重要性:統計は、MySQL が実行プランを生成するためのガイドとして使用され...

XHTML 入門チュートリアル: テキストの書式設定と特殊文字

<br />このセクションでは、XHTML でテキストの書式設定と特殊文字を実装する方法...

Dockerを使用して分散lnmpイメージを作成する

目次1. Docker分散lnmpイメージ生成1. Nginx、MySQL、PHPコンテナを実行する...