如何增加AWS EC2实例的网络带宽?

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

3
为什么只有一个实例?您能进行水平扩展吗? - Mike Brant
我可能可以这样做,也许我应该这样做。我理解单个实例带来的风险,但是应用程序的商业价值较小,这些风险是可以接受的。它只是一年一次的事情。水平扩展以满足 CPU、内存或存储限制是可以理解的,但为了实现更高的带宽而必须这样做似乎很糟糕。200MB 的 NetworkIn 和 60MB 的 NetworkOut 看起来太低了,不过我可能错了。而且我甚至不确定它是每秒钟的速率。AWS CloudWatch 没有明确说明。 - Srini K
尽管您的实例拥有10 Gbit网络接口,但不清楚它是否能够从EC2到互联网实现该性能,或者性能是否仅限于实例间通信。您获得的吞吐量约为1.8 Gbps,带开销。您是否已启用增强型网络?请参考http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking.html。 - datasage
显然,AWS默认以60秒为间隔测量带宽。因此,通俗地说,在ec2实例达到峰值使用时,我真正得到的是1MB / sec的NetworkOut和3.3MB / sec的NetworkIn。哇!那真是低得难以置信。但仍然不确定如何解决。 - Srini K
@MikeBrant 如果您仍需要通过具有类似或甚至更低带宽限制的负载均衡器进行操作,水平扩展有何帮助? - stepanian
@MikeBrant 尽管扩展以实现故障转移是个好主意,但如果一台拥有36个核心、60GB内存和10 GBit接口的服务器无法轻松处理数千个用户,则肯定出了问题。一个合理配置的c4.large应该可以轻松处理几千个请求每秒,而它只有1/16的性能(我已经看到它们做到了这一点,还有不那么强大的虚拟机)。 - BobMcGee
3个回答

8
如果带宽受限,当达到限制时,图形将变得平坦。此外,正如其他人指出的那样,只有1 MB/s的输出和3 MB/s的输入,并且我可以在t2.micro上对外部Internet进行更多操作。
每个请求系统在做什么?以下是按顺序查看的事项清单:
- 线程:您的应用程序中是否存在瓶颈,只有一个线程可以访问资源?这将使CPU使用率低,但会导致您看到的模式。 - 应用程序或服务器中的不良并发模式。负载测试并查看随着连接数的增加而变得越来越慢,同时什么都不做。 - 单个CPU:一个CPU的负载是否达到100%,而其他大部分空闲?(对于30个以上的核心,饱和的CPU仅会给您提供3%的CPU使用率)。一个饱和的CPU + 其他空闲通常意味着存在并发问题,可能是在连接处理方面。 - 记忆力的使用情况如何?您是否完全使用了交换内存?(如果是这样,那是一个非常糟糕的迹象,并且会引起问题)。如果内存使用过度,则通常是内存中的会话存储或过度大小的处理程序线程池的错误。 - 磁盘I/O或外部网络请求:每个请求您是否正在读取或写入?vmstat将告诉您是否花费了很长时间等待I/O被服务。如果是这种情况,我会首先查看日志记录。
- c4.8xlarge实例仅使用EBS,如果存储是磁性的并且您写入访问日志,则可以获得每秒几百次写入。通用SSD为您提供3 IO/s每GB基础,但可以爆发到3000,直到他们用完IO积分。 - 操作系统将尝试组合写操作,但是对于成千上万的并发
如果您的请求非常小,则在网络层面可能会受到连接创建或每秒数据包的瓶颈,但这不太可能。

1
亚马逊有ENI - 弹性网络接口的概念。虽然您可以将其他NIC添加到实例中,但它仍然是一个逻辑接口。网络管道的供应和可用性高度取决于(纯粹取决于)您选择的实例类型。亚马逊有几种类型/系列的实例,如R,I,C,D,G-分别针对内存,IO,计算,密集存储,GPU进行优化。您可以看看是否可以从中挤出最大值。
无论您选择哪种实例类型,您都会遇到阈值,并且无法在某个点之外扩展。可伸缩性特别是与其他可伸缩性因素(如内存/CPU)不同。
修改您的架构,而不是拥有非常大/更大的实例,而是在ELB后面拥有多个中型或大型实例。

谢谢。根据我上面的评论,您还有其他想法吗? - Srini K
如果您仍然需要通过具有类似或甚至更低带宽限制的负载均衡器进行负载均衡,那么拥有多个实例会有什么帮助呢?(假设您仍然使用EC2实例作为负载均衡器,并安装了类似haproxy的软件)。 - stepanian
1
虽然它不太时髦,但横向扩展是可行的解决方案。整个网站和所有 Stack Exchange 网站仅运行在25台服务器上。他们表示,实际上可以只用一台 Web 服务器运行,并且他们的服务器规格与 c4.8xlarge 非常相似(但具有更好的存储)。我真的怀疑他们是否达到了垂直扩展极限,这可能是配置或代码问题,而不是硬件限制。 - BobMcGee

0

你的网络输入和输出实际上超过了50MB/s。如果你的CPU和内存保持在合理范围内,那么你的实例就没问题了。你还应该检查一下数据库连接日志(假设你正在运行一个带有系统的RDB),因为慢速响应可能会导致Web服务器响应变慢。

此外,你应该使用AWS负载均衡器运行你的系统,并设置一个触发器来自动扩展网络输入/输出。这样,当网络负载暂时增加时,就会启动第二个实例来协助处理。如果根本原因确实是数据库连接增加,那么负载均衡器将无法解决问题。相反,你需要改进缓存设置,以减轻每个用户/连接对网站的数据库负担。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接