
これは緊急の質問です。4GB RAM と 2vCPU を搭載した AWS インスタンスが、php-fpm プロセスが多すぎて使い果たされつつあります。
PHP-FPM は、以前は作成していなかったプロセスを大量に作成し始めます。その結果、サイトの読み込みが遅くなります。なぜこのようなことが起こるのかわかりません。
私のphp.ini設定:
html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M
upload_max_filesize = 27M
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M
: : ウェブ:
pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
答え1
あなたの質問に答えます
www.confでこれを変更します(35プロセス)
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
これに(8プロセス) - または好きな数
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000
このタイプミスも修正したいかもしれません
max_file_uploads = 20 = 20
コメント欄の質問に答える
背景として、pm.max_children は、リクエストを処理するために使用できる PHP スレッドの数です。スレッドが使用できない場合、作業が利用可能になるまで、Web サーバーのタイムアウトまで、リクエストはキューに入れられます。
PHP はメモリを大量に消費し、CPU もかなり消費します。たとえば、PHP スレッドが 10 個あるだけの十分な RAM があるのに、30 個割り当てると、サーバーがスワップし、パフォーマンスがひどく低下します。CPU を過剰に割り当てた場合は速度が低下しますが、RAM が不足している場合ほど悪くはありません。
一般的に、サーバーの RAM を使い果たすことなく実行できる PHP ワーカーの数を検討する必要があります。サーバーが PHP をオフにして 2GB の RAM を使用していて、各スレッドが 100MB の RAM を使用するとすると、約 20 の PHP ワーカーを使用できます。RAM はディスク キャッシュとして使用されるため、飽和状態にならないようにし、RAM の一部を空けておいてください。
遅い PHP スレッドとキューイングのバランスを見つける必要があります。誰もあなたに代わってそれをすることはできません。サーバーが完全に利用されても問題がなくなるまで実験することになります。しかし、まずは最大 10 スレッドから始めましょう。空きメモリを監視するには「top」を使用しますが、メモリについては、PHP RAM の使用量を見積もるには「virt」ではなく「res」(メモリに常駐していると思われます) 列を使用する必要があるかもしれません。
オップキャッシュ
PHP7 はかなり最適化されており、デフォルトで有効になっている可能性が高いため、opcache を有効にするというアドバイスは時代遅れであると思われます (ただし、確実ではありません)。
キャッシング
PHP で良好なパフォーマンスを得るための鍵はキャッシュです。カスタマイズされていないページにアクセスする匿名ユーザーは、多くの場合キャッシュされます。たとえ 1 秒、5 秒、60 秒であっても、高負荷のサーバーでは大きな助けになります。キャッシュ ヘッダーにページの有効期限が適切に記述されていることを確認し、Web サーバーを使用している場合は、Nginx / Apache が適切にキャッシュされるように構成します。
CloudFront / CloudFlare などの CDN に静的リソースをキャッシュすることもできます (CloudFlare には無料枠があり、AWS と連携して動作することに注意してください)。CPU や RAM をあまり消費しませんが、帯域幅を節約できます。負荷の高いサーバーでは、少しでも節約できれば助かります。
答え2
お使いの CPU の種類を確認してください。Graviton CPU を使用している場合、CPU とスレッドは 1 対 1 です。
つまり、CPU 数は、数値として持つべきものですpm.max_children
。メモリ リークが心配な場合や、それが繰り返し発生する問題である場合は、いつでもこのpm.max_requests
機能を使用して適切な値に設定できます。
この値は、リークがどの程度速く拡大しているかによって決まります。値が小さすぎると、時々ゲートウェイに不具合が発生する可能性があります。