我在 Amazon VPC 内有一组服务器,它们的工作是从 S3 获取图像文件并进行处理。S3 下载经常会停滞,有时会超过 2 分钟,但最终都会成功。为了排除应用程序问题,我在文本文件中创建了一个简单的 URL 列表,并通过 curl 将它们传输出去:
time <images.txt xargs -I% curl -O %
文件中列出了 352 个图像,大小在 13K 到 1.3MB 之间。重复执行脚本时出现的问题与应用程序遇到的问题相同。在 NAT 实例上直接运行脚本时,我无法重现该问题,而且我还注意到在 NAT 上运行脚本时整体性能显著提高。
经过一番研究,我发现了这个服务器故障问题:“Amazon EC2 VPC:NAT 实例下载速度性能下降“。解决方案是使用 ethtool 关闭 TCP Offload Engine 分散-聚集模式选项。这为我解决了停顿问题,但它并没有解决 NAT 和 NAT 后面的客户端之间的整体性能差异。经过多次调用后,在 NAT 上完成脚本的平均时间约为 15 秒,在 NAT 后面的客户端上完成脚本的平均时间约为 35 秒。
NAT 实例类型是常规的 Amazon NAT t2.small (3.14.26-24.46.amzn1.x86_64)。尽管 NAT 上的 CPU 负载很小,但我尝试了不同的实例类型,包括 m1.medium 和 m3.2xlarge。没有一个对 NAT 性能有任何显著影响。我尝试调整一些不同的设置,包括禁用更多 TOE 功能并增加 ip_conntrack_max 和 conntrack 哈希大小。我真的没想到这些会带来多大的不同,我的测试也没有显示任何显著的变化。
在这种情况下,通过 NAT 时下载速度是否会降低约 50%?我知道 NAT/PAT 会增加额外的跳数和一些额外的数据包处理,但对我来说,这仍然似乎是性能的大幅下降。如果这不是预期的,我该怎么做才能诊断问题?