我在 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 盒设置一个路由表。使用黑洞路由表来证明当我交换路由表时更改会传播。
- 使用 NAT。
curl google.com
作品。- 切换到黑洞。
- 等待
curl google.com
客户端失败。 - 切换到新的 NAT。
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