サーバー上の 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を使用してフロントエンドとバックエンドを分離するサンプルコード

推薦する

CentOS に Nginx をインストールする方法

公式ドキュメント: https://nginx.org/en/linux_packages.html...

Docker コンテナは実行後に終了します (実行を継続する方法)

現象Dockerコンテナを起動する docker run –name [コンテナ名] [コンテナID...

MySQL 5.5 のインストールと設定のグラフィックチュートリアル

MySQL 5.5 のインストールと構成のチュートリアル ノートを整理し、全員と共有します。 1.公...

Zabbixのカスタム監視項目とトリガーについて

目次1. 監視ポート関係の説明操作する2. 監視サービス関係の説明操作する3. テンプレートのインポ...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

Linuxコマンドに基づいてフォルダー内の特定のファイルパスを抽出します

最近では、特定のフォルダ内の特定のファイルを自動的に検索する必要があり、ファイルパスとファイル名を別...

WindowsとLinux間でファイルを転送する方法

WindowsとLinux間のファイル転送(1)WinSCPを使用して、WindowsファイルをLi...

Vue コード強調プラグインの総合的な比較と評価

目次総合的な比較アクティブの観点から機能的な観点から詳細な比較1. エース2. コードミラー3. モ...

MYSQL データベースの基礎 - 結合操作の原理

結合では、ネスト ループ結合アルゴリズムが使用されます。ネスト ループ結合には 3 つの種類がありま...

Javascript を使用して、スライドバー効果のあるスライドナビゲーション プラグインを開発します。

目次1. はじめに2. 使用方法3. 開発プロセス1. モデル例2. イベントとアニメーション4. ...

Angularが予期しない例外エラーを処理する方法の詳細な説明

前面に書かれたコードがどれだけ適切に記述されていても、すべての可能性のある例外を完全に処理することは...

Linuxファイルシステム操作の実装

この読書ノートでは、主にファイルシステムに関連する操作を記録します。ディスクとディレクトリの容量ディ...

Vue+SpringBoot のフロントエンドとバックエンドの分離におけるクロスドメインの問題

フロントエンドとバックエンドを分離した開発では、フロントエンドがバックエンドの API を呼び出して...

CSS で text-align と margin: 0 auto を使用して中央に配置する例コード

CSSでtext-align、margin: 0 autoを使用して中央揃えにするtext-alig...

Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する

マスタースレーブレプリケーションモードのクラスターでは、通常、1 つのマスターノードと 2 つ以上の...