23

現在、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 パラメーターのみを含めました。

より多くのリクエストに対応できるように最適化する方法についてのヒントはありますか? 私は今、恐るべき応答時間を目にしています。

4

7 に答える 7

73

まず、ワーカーが多すぎて、制限が過度に高く設定されています。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 がその下のロケーション ブロックに自動的に伝播されるため、$document_root$fastcgi_script_name を SCRIPT_FILENAME 値として使用できます。

  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. APC (php.ini で apc.enabled=1 を使用) または XCache などの PHP アクセラレータを使用し、memory_limit などの php 設定に注意してください。たとえば、RAM が 2GB のシステムしかない場合、それぞれ 128MB の制限で 500 のワーカーを許可することはほとんど意味がありません。サーバーで他のサービスも実行している場合は特にそうです。

于 2011-03-28T08:07:02.687 に答える
8

置くことも役に立ちます:

access_log off;

これらのリクエストでのログ生成はあまり気にしないと思います。

于 2011-06-04T13:22:02.493 に答える
4

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

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

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

于 2010-08-02T10:46:38.153 に答える
3

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圧縮を最適化するためのカーネルパラメーターについては言及していません(そうであれば)。

そして、上記の他の人が述べたように、あなたの設定は過度に見え、基本的な最適化の概念を理解していないことを示しています. 言い換えれば、プロを雇ってください:-)

于 2013-01-25T04:15:31.910 に答える
1

マシンに 20 個のプロセッサまたはコアがありますか? また、OSのデフォルトでイベントを試してみてください... nginxの代わりにfcgiプロセスを増やしてください...おそらく2〜4個のnginxワーカーで十分です...

于 2010-02-23T22:34:27.117 に答える
0

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

于 2011-05-20T16:49:18.503 に答える
-2

サーバー システムをより高速にする最も効果的な方法は、PHP の代わりに Facebook の HipHop Virtual Machine (HHVM) を使用することです (PHP をインストールする必要はありません)。

HHVM は、CPU の上流に「ジャスト イン タイム コンパイラ」を使用し、通常は PHP コードを PHP 自体よりも 5 倍から 10 倍高速に実行します。これにより、少数のサーバーまたは小規模なサーバーに対応し、消費電力を削減できます。本質的に。ウィキペディアは HHVM を使用して CPU サーバーの負荷を 5 分の 1 に減らしました: http://www.golem.de/news/php-facebooks-hhvm-macht-wikipedia-schneller-1501-111515.html

Linux パッケージとして Nginx と一緒にインストールでき、FastCGI と同様に非常に簡単に Nginx に含めることができます。数分後には小さな「Hello World」PHP ファイルを使用してテストできます: https://github.com/facebook /hhvm/wiki/はじめに

新しい PHP7 PHPNG は、ベンチマーク テストによると、実際には 30% だけ速くなるはずです。

賛成してくれてありがとう

于 2015-02-28T03:13:03.647 に答える