【问题标题】:How to increase network bandwidth of AWS EC2 instance?如何增加 AWS EC2 实例的网络带宽?
【发布时间】:2016-10-26 05:20:10
【问题描述】:

我们在 AWS EC2 中托管了一个 c4.8xlarge 类型的站点。这是一个相当大的系统,具有大量内存和计算资源。本周末,数千名用户在 2 小时内尝试访问该系统。虽然它没有崩溃,但速度变慢了很多,并且未能达到预期的水平。分析统计数据表明,有限的网络带宽是速度放缓的主要原因。 CPU 使用率保持在 6% 以下,但 NetworkIn 和 NetworkOut 在该时间段内似乎分别达到了 60MB 和 200MB 的峰值。虽然我不是网络期望,但一些在线阅读似乎表明通过一个 NIC 的所有流量可能是网络带宽有限的主要原因。这是真的?将站点托管在不同类型的 EC2 实例上是否有助于增加网络带宽?以下是重负载下 networkIn 和 networkOut 指标的样子。

【问题讨论】:

  • 为什么只有一个实例?你可以水平缩放吗?
  • 我可以而且可能我应该这样做。我了解与单个实例相关的风险,但该应用程序几乎没有商业价值,这些都是可以接受的风险。这是一年一次的事情。水平扩展以满足 CPU 或内存或存储限制是可以理解的,但为了获得更高的带宽而不得不这样做似乎很糟糕。 200MB NetworkIn 和 60MB NetworkOut 似乎太低了,可能是我错了。而且我什至不确定它是否每秒。 AWS CloudWatch 没有明确说明。
  • 虽然您的实例确实具有 10 Gbit 网络接口,但不清楚它应该能够实现从 ec2 到 Internet 的性能,或者性能是否仅限于实例间通信。你得到的吞吐量约为 1.8 Gbps,开销。您是否启用了增强网络? docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
  • 显然 AWS 默认以 60 秒为间隔测量带宽。所以一般来说,我真正从 ec2 实例中得到的峰值使用量是 1MB/秒 NetworkOut 和 3.3MB/秒 NetworkIn。哇!这是令人难以置信的低。仍然不确定如何解决它。 forums.aws.amazon.com/message.jspa?messageID=389391
  • @MikeBrant 如果您仍然需要通过具有类似甚至更低带宽限制的负载均衡器,水平扩展将如何提供帮助?

标签: amazon-web-services amazon-ec2 bandwidth


【解决方案1】:

如果您受到带宽的限制,那么当您达到限制时,该图表将变得平坦。此外,正如其他人指出的那样,只有 1 MB/s 的输出和 3 MB/s 的输入,我可以在 t2.micro 上对外部互联网做更多的事情。

系统对每个请求做了什么?以下是我会按顺序查看的内容列表:

  • 线程:您的应用程序中是否存在只有一个线程可以访问资源的瓶颈?这将使 CPU 使用率保持较低,但会导致您看到的模式。
  • 您的应用程序或服务器中的并发模式错误。负载测试并发现它随着连接的增加而变得越来越慢,而什么都不做。
  • 单个 CPU:一个 CPU 是否已加载到 100% 而其他 CPU 大多处于空闲状态? (拥有 30 多个内核,饱和的 CPU 只会给你 3% 的 CPU 使用率)。一个饱和的 CPU + 其他空闲通常意味着并发问题,可能在连接处理中。
  • 内存使用情况如何?你在用swap吗? (如果是这样,这是一个非常糟糕的迹象,并且会导致问题)。如果内存使用过多,则内存中的会话存储或过大的处理程序线程池通常会出现问题。
  • 磁盘 I/O 或外部网络请求:您是对每个请求进行读取还是写入? vmstat 会告诉您是否花费了很长时间等待 I/O 得到服务。如果是这种情况,我会先查看日志记录。
    • c4.8xlarge 实例仅使用 EBS,如果存储是磁性的并且您写入访问日志,则每秒可获得数百次写入。通用 SSD 为您提供每 GB 基础 3 IO/s,但在 IO 积分用完之前可以突增至 3000。
    • 操作系统将尝试合并写入,但有数千个并发

如果您的请求非常小,如果您的请求非常小,您可能会因为连接创建或每秒数据包而在网络层遇到瓶颈。

【讨论】:

    【解决方案2】:

    是的,亚马逊有一个 ENI 的概念——弹性网络接口。虽然您可以为实例添加 NIC;它仍然是一个逻辑接口。网络管道的供应和可用性高度取决于(完全取决于)您选择的类型实例。 Amazon 有几种类型/系列的实例,例如 R、I、C、D、G - 分别在内存、IO、计算、密集存储、GPU 方面进行了优化。你可以看看你是否可以挤压最大。离开他们。

    无论您选择什么作为实例类型,您基本上都会达到一个阈值,并且无法扩展到超过某个点。与内存/CPU 等其他可扩展性因素相比,可扩展性特别独特。

    修改您的架构,而不是拥有非常大/更大的实例,而是在 ELB 后面放置几个中型或大型实例。

    【讨论】:

    • 谢谢。基于以上我的 cmets 的任何其他想法?
    • 如果您仍然需要使用具有类似甚至更低带宽限制的负载均衡器,那么拥有多个实例会有什么帮助? (假设您仍然使用 ec2 实例作为负载均衡器并安装了类似 haproxy)。
    • 虽然不是很时髦,但扩大规模是一个可行的解决方案。 整个站点和所有 Stack Exchange 仅在 25 servers 上运行。他们已经声明他们实际上可以只使用一个 Web 服务器运行,并且他们的服务器具有与 c4.8xlarge 非常相似的规格(但具有更好的存储空间)。我严重怀疑他们在这里达到了垂直扩展限制,这可能是配置或代码问题,而不是硬件限制。
    【解决方案3】:

    您的 NetworkIn 和 Out 实际上 >50mb/s。如果您的 CPU 和内存保持在合理范围内,那么您的实例就可以了。您还应该检查数据库上的连接日志(假设您在系统上运行 RDB)实际上可能是由于数据库响应缓慢导致 Web 服务器响应速度变慢而导致的。

    此外,您应该使用 AWS 负载均衡器运行您的系统,并使用网络输入/输出触发器进行设置和自动缩放。这样,一个辅助实例就会启动,以帮助暂时增加网络负载。如果根本原因确实是数据库连接的增加,那么负载均衡器将无助于解决问题。相反,您希望改进缓存设置,从而减轻每个用户/连接到您网站的数据库的负担。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多