元结论:

元结论:

我在 VPC 中的 Amazon EC2 中有一组服务器。在这个 VPC 中,我有一个私有子网和一个公共子网。在公共子网中,我在 t2.micro 实例上设置了一个 NAT 机器,它基本上运行这个 NAT 脚本启动时,将规则注入 iptables。从私有子网内的机器上下载互联网文件可以正常工作。

但是,我比较了直接从我的 NAT 机器下载外部高带宽 FTP 服务器上的文件的速度与从我的私有子网内的机器(通过同一台 NAT 机器)下载文件的速度。 差异非常明显:从 NAT 机器下载的速度约为 10MB/s,而从私有子网内的机器下载的速度为 1MB/s。

NAT 机器上没有 CPU 使用率,因此这不可能是瓶颈。当我使用更大的机器(m3.medium 具有“中等网络性能”和 m3.xlarge 具有“高网络性能”)尝试进行相同测试时,我也无法获得超过 2.5MB/s 的下载速度。

这是一个可以(并且应该)调整的一般 NAT 问题吗?性能下降的原因是什么?

更新

通过一些测试,我可以缩小这个问题的范围。当我使用 2013 年的 Ubuntu 12.04 或 Amazon Linux NAT 机器时,一切都运行顺利,即使在最小的 t2.micro 实例上,我也能获得完整的下载速度。无论我使用 PV 还是 HVM 机器,都没有关系。问题似乎与内核有关。这些旧机器的内核版本为 3.4.x,而较新的 Amazon Linux NAT 机器或 Ubunut 14.XX 的内核版本为 3.14.XX。有什么方法可以调整较新的机器吗?

答案1

我们终于找到了解决方案。你可以在 NAT 机器上运行以下命令(以 root 身份)来修复下载速度:

ethtool -K eth0 sg off

这将禁用分散-聚集模式,据我所知,这会使网卡本身停止卸载一些网络工作。禁用此选项会导致客户端的 CPU 使用率更高,因为 CPU 现在必须自己完成工作。然而,在 t2.micro 机器上,我们在下载 DVD 映像时只看到大约 5% 的 CPU 使用率。

请注意,这在重新启动后将无法继续存在,因此请确保在rc.local设置 NAT 时或至少在设置 NAT 之前进行设置。

答案2

我在生产中也使用类似设置的 NAT 盒,因此对您的发现非常感兴趣。在生产之前我还没有发现过类似的问题,但也许这是我之前没有注意到的问题。

让我们做一些科学研究吧!

============================================================================

理论:NAT 盒的下载和上传速度比使用 NAT 的客户端更快。

实验:匹配提问者的实验。t2.micros 与 Amazon NAT 2014.09 2 个子网,其中 NAT 通向 IGW,私有子网指向 NAT。(共享租赁。通用 SSD)

程序:

# install speedtest
$ sudo yum install python-pip -y --enablerepo=epel; sudo pip install speedtest-cli
# run against the same server
$ speedtest-cli --server 935 --simple
# run it many times
$ for ((n=0;n<10;n++)); do speedtest-cli --simple --server 935; done

数据:

          Nat:     Client
Download  727.38   157.99
Upload    250.50   138.91

结论:楼主没撒谎。

============================================================================

理论:不同的内核版本会导致不同的结果。

实验:设置 3 个 nat 盒,每个都配有磁性 SSD、m3.medium(无爆发)和专用租户。运行速度测试。

过程:参见上一个实验。此外,为每个 NAT 盒设置一个路由表。使用黑洞路由表来证明当我交换路由表时更改会传播。

  1. 使用 NAT。
  2. curl google.com作品。
  3. 切换到黑洞。
  4. 等待curl google.com客户端失败。
  5. 切换到新的 NAT。
  6. curl google.com作品。

这是我的 3 个 nat 盒:2014.09 3.14.20-20.44.amzn1.x86_64 2014.03 3.10.42-52.145.amzn1.x86_64 2013.09 3.4.62-53.42.amzn1.x86_64

数据:

运行时,这 3 个框都会得到非常相似的结果speedtest-cli --server 935

09/14   03/14   09/13
355.51, 356.55, 364.04
222.59, 212.45, 252.69

来自客户:

09/14   03/14   09/13
351.18, 364.85, 363.69
186.96, 257.58, 248.04

结论:存在性能下降吗?没有。内核版本之间有区别吗?没有。

============================================================================

理论:专用租赁与共享租赁是有区别的。

实验:2 个 NAT 盒。均使用 NAT 2014.09。一个具有共享租户,一个具有专用租户。

数据:两个盒子的性能相似:

Shared Nat   Dedicated Nat
387.67       387.26
296.27       336.89

它们也有相似的标准差:

$ python3
>>> import statistics
>>> shared_download = [388.25, 333.66, 337.44, 334.72, 338.38, 335.52, 333.73, 333.28, 334.43, 335.60]
>>> statistics.stdev(shared_download)
16.858005318937742
>>> dedicated_download = [388.59, 338.68, 333.97, 337.42, 326.77, 346.87, 336.74, 345.52, 362.75, 336.77]
>>> statistics.stdev(dedicated_download)
17.96480002671891

当您运行 2x2 组合时:

      Shared Client/Sh. NAT  Sh. Client/Dedicated Nat  Ded. Client/Sh. Nat  Ded. Client/Ded. NAT
Upload       290.83                      288.17                283.13              340.94
Download     260.01                      250.75                248.05              236.06

结论:确实不清楚共享与专用似乎并没有太大的区别。

元结论:

可能值得重新做的测试是 OP 使用 m3.mediums 进行的测试。我能够复制 t2.micro 结果,但我的 m3.medium 似乎与 OP 的 m3.medium 结果相冲突。

我也想看看您关于内核版本的数据。

也许最有趣的部分是我无法让 m3.medium NAT 快速运行。

答案3

我的测试表明,这使我的下载质量变得更糟。

m3.large 速度测试服务器 m3.medium 专用 NAT 服务器。

此环境中没有其他流量。

sg 平均下载速度:292.19 sg 关闭平均下载速度:259.21

我的测试是:for ((n=0;n<10;n++)); do speedtest-cli --simple ; done

相关内容