web-dev-qa-db-ja.com

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

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
8
AppleGrew

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

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を使用して、差をプロセス数で割ります。それは完璧なシステムではありませんが、かなり正確であることがわかります(上部のデータ列も悪くない場合があります)。

17
cyberx86

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

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

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

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

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

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

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

6
invarbrass

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

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

次に、RAMをphp専用にする必要があり、max_children値が得られます。

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

3
Thomas Decaux