自分の「10ギガビット」インスタンス(c3.8xlarge)をiperfでテストすると、1.73Gbpsを超える転送速度は見られません。これは、scalablelogicのブロガーが報告するものよりも少なくとも4倍悪いです テストは7Gbpsと9.5Gbpsの結果を示しています 。
同じゾーンとリージョンにある2つのc3.8xlargeインスタンス間でテストしているので、これらは最適なベンチマーク条件になるはずです。 1つのc3.8xlargeはiperfサーバーとして機能し、もう1つはiperfクライアントとして機能します。どちらのインスタンスも、Amazon Linux AMI 2013.09.2-AMI-5256b825(64ビット)で起動されます。
なぜこんなに悪い結果が出るのですか?
スループットを向上させたい場合はどうすればよいですか?
AWSサポートは、10GbEの速度はプライベートサブネットネットワーク上のインスタンス間でのみ達成できることを認めています。私の場合は常に1.73Gbpsで最大になるパブリックIPとは対照的に、プライベートIPを使用する必要があります。ゾーンや地域によって変わる場合があります。異なる結果が表示された場合は、ここに投稿してください。
これは、外部スループットに関しては、c3.8xlarge(または同様の10 GbEインスタンス)が「高」ネットワーク機能を備えた小さなインスタンスと比較してひどい価値を提供することを意味します。 c1.mediumインスタンスの価格はc3.8xlargeの1/16ですが、c3.8xlarge 10 GbEインスタンス(〜1.7 Gbps)の半分以上のスループット(〜0,95 Gbps)が可能です。
AWSサポートの回答については、Wowzaフォーラムの このスレッド を参照してください。
仮想化レイヤーのため、ネットワークレイヤーはDMAを直接使用できず、CPUはsoftirqの実行に時間を費やしてデータを前後にコピーする必要があります。この場合、転送されるパケットが多すぎると、そのために複数のCPUコアを使用するようにカーネルに指示します。
watch -n1 cat /proc/softirqs
を実行し、NET_RXを確認することで、これを監視できます。
幸い、 パケットステアリング と呼ばれる機能があり、パケットの受信と転送に、より多くのCPUコアを使用できます。
CPUがパケットの受信に複数のコアを使用できるようにするには、echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
を実行できます。
トランジットについては、echo f0 > /sys/class/net/eth0/queues/tx-0/xps_cpus
を行うことができます
このように、最初の4コアは受信に使用され、次の4コアは送信に使用されます。
f => 1+2+4+8 = 15 in hexadecimal
f0 => 16+32+64+128 = 240 in hexadecimal
テストでiperfをどのように実行しているかはわかりませんが、基盤となるネットワークスタックの実際の最大スループットをより適切に反映する結果を得るには、マルチスレッドで実行する必要がある場合があります。最適なスループットに近いと思われるものに到達するには、スレッド数を最大96に増やす必要があることがあります。
これがお役に立てば幸いです。しばらくの間、EC2の真のパブリックフェーシングスループットについて疑問に思っていました。 C4.8xlインスタンスでいくつかのWowzaEdgeインスタンスの実行を終了したばかりで、インスタンスあたり6 + Gbpsで問題はありませんでした。 http://www.aerospike.com/blog/boosting-Amazon-ec2-network-for-high-throughput/ によると、以下のベンチマークは非常に正確であるようです。
*ネットワーク帯域幅Amazonは、さまざまな量のメモリとCPUを備えたさまざまなインスタンスタイプを提供しています。ただし、十分に「文書化」されていないのは、低、中、高、および10Gbに単純に分類されるネットワーク機能です。 AWSでAerospikeサーバーを実行し、AWSでiperfを実行する実験に基づいて、これらのカテゴリを次の数値に適切に定義することができました。