私は分析パッケージを作成しており、プロジェクトの要件では、1日あたり10億ヒットをサポートする必要があると記載されています。うん、「10億」。言い換えれば、1秒あたり12,000ヒット以上が持続し、できればバーストの余地があることが望ましい。これには複数のサーバーが必要になることはわかっていますが、「より多くのハードウェアを投入する」前に、各ノードから最大のパフォーマンスを引き出そうとしています。
現在、ヒットトラッキングの部分は完了しており、十分に最適化されています。ほとんどの場合、リクエストを直接Redisに保存します(後でHadoopで処理するため)。アプリケーションはPython/Djangoで、ゲートウェイにgunicornを使用しています。
私の2GB Ubuntu 10.04 Rackspaceサーバー(プロダクションマシンではない)は、毎秒約1200の静的ファイルを処理できます(単一の静的アセットに対してApache ABを使用してベンチマーク)。比較すると、静的ファイルリンクをトラッキングリンクと入れ替えても、毎秒約600のリクエストが発生します。これは、同じ静的アセットを提供するよりも2倍遅いだけなので、トラッカーが適切に最適化されていることを意味します。繰り返し。
しかし、何百万ものヒットでベンチマークすると、いくつかのことに気づきます-
私の質問-
a。私はこのサーバーを使い果たしそうですか? 1,200 /秒の静的ファイルのnginxパフォーマンスは、他の人が経験したものと同等ですか?
b。そのような大量アプリケーションに共通のnginxチューニングはありますか?私は64に設定されたワーカースレッドと8に設定されたgunicornワーカースレッドを持っていますが、これらの値を微調整しても、私にはあまり効果がなく、害もないようです。
c。着信接続を制限する可能性のあるLinuxレベルの設定はありますか?
d。長時間実行テストでパフォーマンスが250r/sに低下する原因は何ですか?繰り返しになりますが、これらのテスト中にメモリが限界に達しておらず、HDDの使用はゼロです。
事前にありがとう、すべて:)
[〜#〜] edit [〜#〜]これが私のnginx設定です- http://pastie.org/1450749 -それは主にバニラで、明らかに脂肪が取り除かれています。
Nginxのworker_threadsを悪用しています。それほど多くの労働者を動かす必要は全くありません。 CPUの数と同じ数のワーカーを実行して、1日と呼ぶ必要があります。同じサーバーでgunicornを実行している場合は、nginxワーカーを2つに制限する必要があります。それ以外の場合は、これらのすべてのプロセスを管理するために必要なすべてのコンテキスト切り替えでCPUをスラッシュするだけです。
私は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
セットアップの容量がわかれば、最大ワーカー接続の計算は簡単です。コアの合計容量/数は最大ワーカー接続です。総容量を計算するには、いくつかの方法があります。
上記の方法でうまくいかない場合は、以下の方法を試してください。私はRAMとIOを無視して幅広い仮定を行っています。これらも考慮に入れますが、これらは開始点を提供し、そこから調整を行うことができます。
帯域幅がボトルネックであると仮定して、nginxが提供している平均オブジェクトサイズを取り、それで帯域幅を分割すると、サポートされる最大qpsが得られます。
2番目の仮定では、CPUがボトルネックです。この場合、 リクエスト時間 を測定し、それを1で割り、システムのコア数で乗算します。これにより、nginxが処理できる1秒あたりのリクエスト数がわかります。