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

推薦する

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

HTMLフォーム要素の詳しい解説(パート2)

HTML 入力属性値属性value 属性は、入力フィールドの初期値を指定します。 <フォーム...

Linuxでホスト名を永続的に変更する方法

ホスト名を変更する場合は、以下の手順に従ってください。ホスト名の使用hostnameコマンドを使用す...

Linux でユーザーにルート権限を追加する方法の概要

1. ユーザーを追加します。まず、adduser コマンドを使用して共通ユーザーを追加します。コマン...

VueプロジェクトでReactを書く方法の詳細

jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

MySQL のデッドロックとデータベースおよびテーブル シャーディングの問題の詳細な説明

MySQL 運用上の問題点を記録します。ビジネスシナリオと問題の説明外部インターフェースをリクエスト...

MySQL のインデックス障害の一般的なシナリオと回避方法

序文これまでにも、一部の SQL ステートメントを不適切に使用すると MySQL インデックスが失敗...

Vue3のいくつかの利点についての簡単な説明

目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...

キャンバス操作プラグイン fabric.js の使い方を詳しく解説

Fabric.js は非常に便利なキャンバス操作プラグインです。ここでは、日常のプロジェクトで使用さ...

インデックスは MySQL クエリ条件で使用されますか?

雇用主から MySQL クエリ条件でインデックスが使用されるかどうかを尋ねられた場合、どのように答え...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...

MySQL トリガーの定義と使用方法の簡単な例

この記事では、MySQL トリガーの定義と使用方法について説明します。ご参考までに、詳細は以下の通り...

K8S クラスターを構築し、Hyper-V で Docker をインストールする方法

Win10 システムをインストールしていて、k8s クラスターを構築する場合、Win10 に付属する...

Vue3とElectronを使ったデスクトップアプリケーションの詳しい説明

目次Vue CLIはVueプロジェクトを構築しますVue プロジェクトをマークダウン エディターに変...