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

推薦する

JavaScriptのプロトタイプオブジェクトを徹底的に理解しましょう

目次1. プロトタイプとは何ですか? 1.1 関数プロトタイプオブジェクト1.2 コンストラクタを使...

MySql インデックスを表示および最適化する方法

MySQL はハッシュ インデックスと Btree インデックスをサポートしています。 InnoDB...

プロジェクトにaxiosをカプセル化する実際のプロセス

目次序文axiosカプセル化の利点パッケージのアイデア設定の優先順位axiosインスタンス構成1. ...

Linux で rsync を使用する方法

目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...

CSSを使用して3Dフォトウォール効果を作成する

CSS を使用して 3D フォト ウォールを作成します。具体的なコードは次のとおりです。 <!...

CSS3 フィルターの違いと応用の詳しい説明:ドロップシャドウフィルターとボックスシャドウ

標準 CSS3 を使用して要素の影の効果を実現するには、2 つの手順があります。1 つ目は一般的なb...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

Linux の権限管理コマンド (chmod/chown/chgrp/unmask) の詳細な説明

目次chmod例権限に関する特別な注意分析するチョーンchgrp umask Linux オペレーテ...

IE8を閲覧するときにウェブサイトが自動的にIE7互換モードを使用するようにする

序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...

nginxリバースプロキシwebSocket設定の詳細な説明

最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレ...

HTML入力ドロップダウンメニューを実装する方法

コードをコピーコードは次のとおりです。 <html> <ヘッド> <m...

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

/****************** * カーネルデバッグ技術 ****************...

Linux システムに Zookeeper サービスをインストールする方法

1. /usr/local/services/zookeeper フォルダを作成します。 mkdir...

JavaScript における var と let の違い

目次1. スコープはさまざまな方法で表現されます2. 変動昇進と非昇進の違い3. 一時的なデッドゾー...

MySQL 5.7 でブロックポジショニング DDL の問題を解決する

前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...