0

ubuntu 64 の ec2 c1.xlarge マシンで単純な node.js と Cyclone Hello World アプリをロード テストしようとしています。これには 8 コアがあります。nginx をロード バランサーとして使用しており、スーパーバイザーはコアごとに 1 つのプロセスを起動しています。マシンで以下を実行すると、node.js の qps は約 6500 です。

 ab -n 5000 -c 25 http://127.0.0.1

リモート マシンから ab を実行すると、同じゾーンにあるマシンであっても、qps は約 175 qps に低下します。開発マシンから実行するとさらに悪化します。

それで、私は何が欠けていますか?リモート マシンからより多くの接続を許可するために調整する必要があるパラメーターはありますか? 何かが足りない気がします。sysctl 構成ファイルで調整する必要がある魔法の nob はありますか? そのかなり生のマシンですが、起動時に、以下は私が調整したノブです。

sysctl -w fs.file-max=128000;
sysctl -w net.ipv4.tcp_keepalive_time=300;
sysctl -w net.core.somaxconn=250000;
sysctl -w net.ipv4.tcp_max_syn_backlog=2500;
sysctl -w net.core.netdev_max_backlog=30000;
sysctl -p
4

1 に答える 1

3

レイテンシによってテストの速度が低下し、スループットが低下します。ほとんどの場合、リモート リクエストはローカル リクエストよりも時間がかかるため、ローカルで実行している場合よりもリモートで実行している単一スレッドのスループットが低くなります。したがって、リクエストのペースを調整しない Ab を使用すると、全体のスループットが低下する必要があります。

たとえば、25 個のスレッドがあるとします。リクエストをローカルで行うのに 50 ミリ秒かかるとしましょう。1 つのスレッドの場合、次のようになります。

1000 (1 秒) / 50 = 1 秒あたり 20 リクエスト - これは、1 つのスレッドで可能な最大スループットです。

合計 25 * 20 = 500 req/s になる 25 以上のスレッド。

この式を使用して応答時間をたとえば 250 ミリ秒に変更すると、スレッドの合計最大スループットは 4 要求/秒に低下し、1 秒あたり 80 要求の 25 スレッドで可能な全体的な最大値が得られます。

これをさらに一歩進めると、25 個のスレッドで 6000 qps を取得した場合、論理的には、アプリはローカルで呼び出されたときに約 4 ミリ秒で応答します。リモートで 175 qps しか得られない場合、それは応答時間が約 142 ミリ秒に低下するためです。そのため、システムでは約 138 ミリ秒の遅延が発生します (与えるか取るか)。これが問題です。

于 2012-05-21T14:22:50.863 に答える