php-fpm設定の何が問題になっていますか?


8

64ビットサーバーがありますが、RAMは256 MBしかありません。そこで、PHPに接続するためにfast-cgiを使用してnginxサーバーに移動しました。PHP 5.3.6を実行しています。

問題は、2〜3日ごとにPHPページにアクセスしようとすると、サーバーの内部エラーが発生することです。唯一の回避策は、php-fpmを手動で再起動することです。これは、チョークを引き起こしているいくつかの間違ったパラメータを設定する必要があったことを意味します。以下に、関連する構成をリストしました。

/etc/php-fpm.conf:-

include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0

/etc/php-fpm.d/www.conf:-

[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

/etc/nginx/php.conf:-

location ~ \.php {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;

        fastcgi_pass unix:---some-location---;
}

アップデート1

そして、4つのnginxプロセスを実行しています。平均して、各php-fpmプロセスには35MBのRAMが必要です(仮想メモリサイズはそれぞれ320MB)。MySqlプロセスも実行しています。

アップデート2

ログを貼り付けるのを忘れました。

php-fpmエラーログ:-

WARNING: [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 8 children, there are 1 idle, and 7 total children
WARNING: [pool www] server reached max_children setting (10), consider raising it
NOTICE: Terminating ...

php-fpm www.error log:-

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137

回答:


17

オフハンドの推奨は、設定値を下げることです-おそらくそれらを半分に減らします。

pm.max_children = 10 35MB /プロセス= 350MBとすると、256MBのボックスでは、大量のスワッピングまたはメモリ不足のどちらかを意味します。どちらも適切ではありません。

他のプロセスには少なくとも100MB、おそらく150MBでも安全だとしたら、その数値を35MBで割ってmax_childrenを取得します。他のすべての番号を並べてください:

pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500

PHP-FPMを停止して実行freeし、使用可能なメモリのアイデアを取得します。35MBで割り、max_childrenを取得します。

MySQLが使用するメモリの量によっては、max_childrenを3に下げる必要がある場合があります。

PHP-FPMプロセスは多くのメモリを共有していることがわかりました。実際にどれだけ使用されているかを確認するために簡単な実験を行います。PHP-FPMを停止して実行しfreeます。PHP-FPMを起動して、いくつかの一般的なページ(ロードされたページによってメモリが増加するため必要です)にアクセスし、使用された合計メモリを確認します。再度free、プロセスの数で差異を割ります。完璧なシステムではありませんが、かなり正確であることがわかります(上部のデータ列も悪くない場合があります)。


立ち止まっfreeてスタート。その空きメモリを35で割ってを取得しmax_children valueます。ラストパラの目的がわからなかった。
AppleGrew 2011

PHPの最大2.3プロセスしかサポートできないようです。:Pとにかく私は今max_children3にいます
AppleGrew

a)「最後のパラ」の目的は、PHPプロセスが消費する量についてより正確な値を取得することでした。psまたはtopの値が、使用可能なメモリの低下と常に一致するとは限りません。利用可能なメモリを見つけたら、いくつかのPHPプロセスを実行し、利用可能なメモリを再測定します(プロセスが使用するメモリを調べる代わりに)、各プロセスが使用するメモリの量の「代替」(そしておそらくはより良い)値を取得できます。b)invarbrassによって提案されたmemory_limitパラメータも良い提案です。c)mysqltuner.plスクリプトを確認します。DB構成に役立つ場合があります。
cyberx86 2011

@ cyberx86、あなたはどのような価値freeを考慮に入れていますか?ディスクキャッシュに使用される '-/ + buffers / cache'行からのものですが、実際にはアプリでは無料ですか?
Roman Newaza

@RomanNewaza-はい、アプリケーションで使用可能なメモリを確認したいので、「-/ + buffers / cache」の下の「free」のエントリを使用します。
cyberx86

6

php-fpmの設定は問題ないようです。

ただし、実行しているサーバーはリソースに多少の制約があります。ログから、PHPプロセスが使用可能なメモリを使い果たしていることは明らかです。

cyberx86によって提供される提案に追加:

php.iniファイルのmemory_limitパラメータを編集してみることができます(こちらを参照)(ただし、これで十分かどうかはわかりません)。

システムメモリが少ないことを考えると、32ビットOSへの切り替えを真剣に検討する必要があると思います。x64 OSを使用することは、実際に有益であるというよりは害を及ぼします。

MySqlデータベースでInnoDBストレージを使用していない場合は、my.cnfでInnoDBをオフにすることも検討できます。これにより、さらに100 MBのRAMが節約されます。

Lowendboxには、低メモリ構成向けにサーバーを最適化する方法に関する優れたチュートリアルがあります。


さて、私の声は、ホスティング会社に32ビットOSを提供しようと推論しようとする声がかすれてきました。これらの企業は64ビットのみを提供しているようです。32ビットOSを提供している会社は1つしか見つかりませんでしたが、はるかに高額です。
AppleGrew 2011

3

PHPによって取得されたメモリを見つけるための非常に便利なコマンド:

ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

次に、php専用のRAMを分割し、max_children値を取得します。

また、手動で(エンドポイントのphp-statusを設定する必要があります)またはNagiosで監視できます。


awk: fatal: division by zero attempted
samayo 2014年

1
php5-fpmプロセスがないことを意味します。自分のプロセスに合わせてプロセス名「php5-fpm」を変更する必要があります。
Thomas Decaux 2014年

このコマンドを使用したのですが、ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'-Cオプションが機能しません。
2014年

コマンドを個別に実行してみてください(つまり、ps --no-headers -o "rss、cmd"が最初など...)。これは簡単にデバッグできるはずです
Thomas Decaux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.