web-dev-qa-db-ja.com

Nginx + PHP-FPMを最適化して、応答時間を短縮します(Openx広告配信用)

OpenXで広告を配信するために、現在Nginx + PHP-FPMを実行しています。現在、負荷が低いときでも、私の応答時間は恐ろしいものです。ただし、CPUとメモリのリソースには問題がないため、ボトルネックが何であるかを理解できません。

Nginxおよびphp-fpmの現在の構成は次のとおりです。

worker_processes 20;
worker_rlimit_nofile 50000;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  15000;
    multi_accept off;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    tcp_nopush     off;

    keepalive_timeout  0;
    #keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_comp_level 2;
    gzip_proxied    any;
    gzip_types    text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

server {
    listen   80;
    server_name  localhost;
    access_log  /var/log/nginx/localhost.access.log;

# Default location
    location / {
        root   /var/www;
        index  index.php;
    }

## Parse all .php file in the /var/www directory
    location ~ .php$ {
        fastcgi_pass   localhost:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include fastcgi_params;
        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_ignore_client_abort     off;
    }

PHP-FPM:
rlimit_files = 50000
max_children = 500

PHP-FPM用に変更したPHP-FPMパラメータのみを含めました。

より多くのリクエストに対応できるように最適化するためのヒントはありますか?現在、恐ろしい応答時間が見られます。

23
Fariz

まず、ワーカー数が多すぎ、制限が過度に高く設定されています。 php-fpmの最大ワーカー数だけでは、サーバーがかなりダウンします。サーバーの制限を解除しても、必ずしも速度が向上するわけではありませんが、実際には逆の効果がある場合があります。

  1. ワーカー数:20プロセッサー/コアマシンがない場合、20はほとんど意味がありません。ワーカーが過剰なコンテンツスワップを行うため、実際には悪影響が生じています。デュアルコアプロセッサを実行している場合は、2人のワーカーで十分です。

  2. 労働者のつながり:繰り返しになりますが、天に限界を投げるだけでは問題は解決しません。 ulimit -nの出力が1024のようなものである場合、ワーカー接続を1024以下(おそらく768)に設定する必要があります。これは、特にPHPのようなもので2 x 1024の同時接続が発生することはほとんどありません。

  3. ルートの場所、およびPHP設定については、 http://wiki.nginx.org/Pitfalls を参照してください。ルートディレクティブをサーバーに置くと最適です{ $ document_rootは、その下のロケーションブロックに自動的に伝達されるため、SCRIPT_FILENAME値として$ document_root $ fastcgi_script_nameを使用できます。

  4. 静的ファイルを直接処理することもできます。つまり、

    location ~* \.(ico|css|js|gif|jpe?g|png)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    
  5. PHP Accelerator、すなわちAPC(with apc.enabled = 1 in php.ini))またはXCacheを使用し、memory_limitなどのphp設定に注意してください。たとえば、 RAMが2GBのシステムでは、500MBのワーカーにそれぞれ128MBの制限を与えることはほとんど意味がありません。サーバーで他のサービスも実行している場合は特にそうです。

72
KBeezie

置くのにも便利でしょう:

access_log off;

私はあなたがこれらのリクエストでのログ生成を本当に気にしていないと思うので。

7
zmf

20コア/プロセッサを使用しているとは思えないので、ワーカーの数を確実に減らす必要があります。さらに、私はあなたのデータベースサーバーを調べます、問題がそこにあるという大きな可能性があります。

さらに、worker_rlimit_nofile50000に上げました。通常、オペレーティングシステムが制限を1024(デフォルト)に設定していることを知っていると思います。ulimit -nと入力すると、現在の制限をリクエストできます。

Init.dでこのコマンドulimit -n 50000または stackoverflowでこの他の質問にアクセス を実行して、システム全体にlimits.confを永続的に設定する方法を学ぶことにより、NOFILE(開いているファイルの数)のハードリミットを上げることができます。

4
user145633

Nginxとphp5-fpmでパフォーマンスを最大限に引き出すことは芸術です。あなたが提供しているコンテンツの種類を本当に理解する必要があります。

たとえば、try_filesの使用や、構成内のキャッシュの種類は表示されません。 nginxにmemcacheのサポートが組み込まれていることをご存知ですか?画像やhtml/cssだけでなく、phpページもキャッシュできます。クリック数を重視する場合、ディスプレイがカウントされなくても、それらのクリック数はカウントされます。

バナーをtmpfsマウントに置き、access_logまたはerror_logをログに記録しないでください。phpで不要なモジュールを無効にし、mysqlの最新バージョンを使用し、innodbを使用してテーブルのロックを減らし、innodbのフラッシュメソッドで遊んでディスクを減らします。書き込み、mysqlの最大メモリテーブルの増加、SQLを介して結合が要求されたときのディスク上の一時ファイルの作成を減らすなど.

Nginxは、非常に大きく複雑な式の一部にすぎません。 TCPスタックおよびネットワークカードのパフォーマンス、スワップ使用量、メモリ使用量、またはOpenXを介して提供しているHTML/CSSのgzip圧縮を最適化するためのカーネルパラメータについても触れていません(ある場合) 。

そして、はい、前述のように、設定が過剰に見え、基本的な最適化の概念を理解していないことを示しています。言い換えれば、専門家を雇う:-)

3
Skaag Argonius

マシンに20のプロセッサまたはコアがありますか?また、OSのデフォルトでイベントを試すこともできます...より多くのnginxではなくより多くのfcgiプロセス...多分2〜4個のnginxワーカーで開始すれば十分です...

1
Todd

人々が言及しているように、間違いなく労働者もそうかもしれません。私は個人的に、php opcodeキャッシングではAPCよりもxcacheを好みます。変更されたcentmin auto bashシェルnginx/php-fpmインストールスクリプトで構成をチェックアウトする必要があります http://vbtechsupport.com/796/

0
p4guru