Amazon EC2 10 Gigabit 实例上的最佳速度是 1.73 Gbps?

Amazon EC2 10 Gigabit 实例上的最佳速度是 1.73 Gbps?

当我用 iperf 测试我自己的“10 Gigabit”实例 (c3.8xlarge) 时,我看不到超过 1.73 Gbps 的传输速率。这至少比可扩展逻辑博客的一位博主报告的要差四倍,测试结果显示为 7 Gbps 和 9.5 Gbps

我正在测试位于同一区域和地区中的两个 c3.8xlarge 实例,因此这些应该是最佳基准测试条件。一个 c3.8xlarge 充当 iperf 服务器,另一个充当 iperf 客户端。两个实例均使用 Amazon Linux AMI 2013.09.2 - ami-5256b825(64 位)启动。

为什么我看到的结果如此糟糕?

如果我想提高吞吐量,我应该注意什么?

答案1

AWS Support 承认,10 GbE 速度只能在私有子网中的实例之间实现。它要求使用私有 IP,而不是公共 IP,在我的例子中,公共 IP 的最大速度始终为 1.73 Gbps。这可能会根据区域和地区而变化。如果您看到不同的结果,请在此处发布。

这意味着,就外部吞吐量而言,与具有“高”网络功能的小型实例相比,c3.8xlarge(或类似的 10 GbE 实例)的价值非常低。c1.medium 实例的价格是 c3.8xlarge 的 1/16,但它的吞吐量(~0.95 Gbps)是 c3.8xlarge 10 GbE 实例(~1.7 Gbps)的一半以上。

此主题在 Wowza 论坛上查看 AWS Support 的答案。

答案2

由于虚拟化层的存在,网络层无法直接使用 DMA,CPU 必须花时间来回复制数据,执行软中断。在这种情况下,当您传输的数据包过多时,您需要告诉内核为此使用多个 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

答案3

希望这对您有所帮助,我们一直在想 EC2 真正的面向公众的吞吐量。我们刚刚在 C4.8xl 实例上运行了几个 Wowza Edge 实例,每个实例 6+Gbps 时没有出现任何问题。每http://www.aerospike.com/blog/boosting-amazon-ec2-network-for-high-throughput/,下面的基准似乎非常准确:

*网络带宽 Amazon 提供一系列实例类型,具有不同数量的内存和 CPU。然而,没有得到充分“记录”的是网络功能,这些功能被简单地分为低、中、高和 10Gb。根据我们在 AWS 上运行 Aerospike 服务器和在 AWS 上运行 iperf 的实验,我们能够将这些类别更好地定义为以下数字:

  • 低 – 最高 100 Mbps
  • 中等 – 100 Mbps 至 300 Mbps
  • 高 – 100 Mbps 至 1.86 Gbps
  • 10Gb – 高达 8.86Gbps*

答案4

我不确定您如何运行 iperf 进行测试,但有时需要以多线程方式运行才能产生更能反映底层网络堆栈实际最大吞吐量的结果。我发现有时需要将线程数增加到 96 才能达到接近最佳吞吐量的效果。

相关内容