web-dev-qa-db-ja.com

Nginxリクエスト/秒を最大化するためのヒント?

私は分析パッケージを作成しており、プロジェクトの要件では、1日あたり10億ヒットをサポートする必要があると記載されています。うん、「10億」。言い換えれば、1秒あたり12,000ヒット以上が持続し、できればバーストの余地があることが望ましい。これには複数のサーバーが必要になることはわかっていますが、「より多くのハードウェアを投入する」前に、各ノードから最大のパフォーマンスを引き出そうとしています。

現在、ヒットトラッキングの部分は完了しており、十分に最適化されています。ほとんどの場合、リクエストを直接Redisに保存します(後でHadoopで処理するため)。アプリケーションはPython/Djangoで、ゲートウェイにgunicornを使用しています。

私の2GB Ubuntu 10.04 Rackspaceサーバー(プロダクションマシンではない)は、毎秒約1200の静的ファイルを処理できます(単一の静的アセットに対してApache ABを使用してベンチマーク)。比較すると、静的ファイルリンクをトラッキングリンクと入れ替えても、毎秒約600のリクエストが発生します。これは、同じ静的アセットを提供するよりも2倍遅いだけなので、トラッカーが適切に最適化されていることを意味します。繰り返し。

しかし、何百万ものヒットでベンチマークすると、いくつかのことに気づきます-

  1. すべてのNginxログをオフにし、カスタムコードは何もせず、リクエストの詳細をRedisに保存するため、ディスク使用量は予想されません。
  2. 非一定のメモリ使用量-おそらくRedisのメモリ管理が原因で、私のメモリ使用量は徐々に上がってから下がるでしょうが、一度もボトルネックになったことは一度もありません。
  3. システムの負荷が2〜4前後になると、最も重いベンチマークでもシステムは応答し、手動で表示できます http://mysite.com/tracking/pixel その他)サーバーは毎秒600のリクエストを実行します。
  4. 短いテストを実行すると、50,000ヒット(約2分かかる)とすると、毎秒600リクエストが安定して信頼できるものになります。より長いテストを実行した場合(これまでに3.5mまで試行)、r/sは約250に低下します。

私の質問-

a。私はこのサーバーを使い果たしそうですか? 1,200 /秒の静的ファイルのnginxパフォーマンスは、他の人が経験したものと同等ですか?

b。そのような大量アプリケーションに共通のnginxチューニングはありますか?私は64に設定されたワーカースレッドと8に設定されたgunicornワーカースレッドを持っていますが、これらの値を微調整しても、私にはあまり効果がなく、害もないようです。

c。着信接続を制限する可能性のあるLinuxレベルの設定はありますか?

d。長時間実行テストでパフォーマンスが250r/sに低下する原因は何ですか?繰り返しになりますが、これらのテスト中にメモリが限界に達しておらず、HDDの使用はゼロです。

事前にありがとう、すべて:)

[〜#〜] edit [〜#〜]これが私のnginx設定です- http://pastie.org/1450749 -それは主にバニラで、明らかに脂肪が取り除かれています。

15
linkedlinked

Nginxのworker_threadsを悪用しています。それほど多くの労働者を動かす必要は全くありません。 CPUの数と同じ数のワーカーを実行して、1日と呼ぶ必要があります。同じサーバーでgunicornを実行している場合は、nginxワーカーを2つに制限する必要があります。それ以外の場合は、これらのすべてのプロセスを管理するために必要なすべてのコンテキスト切り替えでCPUをスラッシュするだけです。

8
blueben

私はnginxを使用して、静的コンテンツの5Kリクエストを1秒で処理しました。現在1024に設定されているworker_connectionsの数を増やすことができます。

Max_clientの計算は次のようになります。

メインセクションのworker_connectionsとworker_procesesを使用すると、maxclients値を計算できます。

max_clients = worker_processes * worker_connections

リバースプロキシの状況では、max_clientsは次のようになります。

max_clients = worker_processes * worker_connections/4

http://wiki.nginx.org/EventsModule#worker_connections

セットアップの容量がわかれば、最大ワーカー接続の計算は簡単です。コアの合計容量/数は最大ワーカー接続です。総容量を計算するには、いくつかの方法があります。

  1. 最も現実的な数値が得られる設定を試してみて、ベンチマークを行うことをお勧めします。 siege、pummel、Apacheベンチなどのツールを使用できます。テスト中にシステムリソースの使用状況を測定することを忘れないでください。

上記の方法でうまくいかない場合は、以下の方法を試してください。私はRAMとIOを無視して幅広い仮定を行っています。これらも考慮に入れますが、これらは開始点を提供し、そこから調整を行うことができます。

  1. 帯域幅がボトルネックであると仮定して、nginxが提供している平均オブジェクトサイズを取り、それで帯域幅を分割すると、サポートされる最大qpsが得られます。

  2. 2番目の仮定では、CPUがボトルネックです。この場合、 リクエスト時間 を測定し、それを1で割り、システムのコア数で乗算します。これにより、nginxが処理できる1秒あたりのリクエスト数がわかります。

2
Sameer