AWS EFS 的性能下降

Posted

技术标签:

【中文标题】AWS EFS 的性能下降【英文标题】:Degrading Performance of AWS EFS 【发布时间】:2017-01-16 09:38:00 【问题描述】:

我们已经在 aws ec2 上托管了我们的 wordpress 站点,具有自动缩放和 EFS。但是突然之间,PermittedThroughput 接近于零字节,并且 BurstCreditBalance 变得越来越少(从 2TB 到几 Mbs!)。 EFS 大小只有 2GB 左右!我们第二次面临这个问题。我想知道有没有人对这种情况有类似的经验或任何建议。计划在未来几天从 EFS 转移到 NFS 或 glusterfs。

【问题讨论】:

迁移到您自己的使用 EBS 的 NFS 或 glusterfs 是没有意义的。正如@Michael 关于“存储更多文件”的提示所指出的那样,您可以简单地将几个巨大的虚拟文件放入您的 EFS 存储中以获得吞吐量。 【参考方案1】:

Amazon EFS 上的吞吐量随着文件系统的增长而扩展。

...

文件系统的突发能力(时间长度和突发率)与其大小直接相关。较大的文件系统可以在较长时间内以较大的速率突增。因此,如果您的应用程序需要进行更多突发(即,如果您发现文件系统的突发信用已用完),您应该增加文件系统的大小。

注意

Amazon EFS 没有预置,因此要使您的文件系统更大,您需要向其中添加更多数据。

http://docs.aws.amazon.com/efs/latest/ug/performance.html

您提到您的文件系统仅存储 2 GiB 的数据。这就是问题所在:乍一看这违反直觉,但 EFS 实际上随着它的更大而变得更快...反之亦然。小型文件系统仅以每 GiB 存储数据每秒 50 KiB/秒的速率累积突发信用。

因此,对于 2 GiB 的文件系统,您将通过每天传输非常少量的数据来耗尽您的信用:

60 sec/minute ×
60 min/hour ×
24 hr/day ×
0.05 MiB/s per GiB stored ×
2 GiB stored = 8,640 MiB/day

所以大约 8.6 GiB 每天是这个文件系统可以承受的所有数据传输。

这似乎很奇怪,直到您记得您每月只需支付 0.60 美元。

您可以通过简单地存储更多数据来线性提高性能。用于计算的文件系统大小每小时更新一次,所以如果你走这条路,在几个小时内你应该会看到一个上升。

到目前为止,它运行良好的原因是每个新文件系统都带有相当于 2.1 TiB 的初始信用余额。这主要是为了让文件系统在您最初将数据加载到文件系统时快速,但在总存储量较低的环境中,例如您描述的环境,它将持续数天或数周,然后突然(显然)您终于看到系统稳定到其正确的基线行为。

基本上,您需要为两个相互关联的参数(总存储容量和基线吞吐量)的设置付费,这两个参数都不是您可以配置的。如果您想要更多存储空间,只需存储更多文件...如果您想要更高吞吐量,只需...存储更多文件。

【讨论】:

【参考方案2】:

这里的聚会有点晚了。

TL;DR

要增加总基线吞吐量,请生成虚拟数据以增加文件系统的大小。这将允许您的文件系统具有更好的基线和突发性能。


有两个考虑:

    每 GB 的成本因地区而异,但 price 约为每 GB 0.30 美元 - 0.36 美元(截至 2018 年) 随着文件系统大小的增加,突发聚合吞吐量、最大突发持续时间和文件系统可以突发的时间百分比(每天)等其他指标也会增加。意见:我喜欢 256+ GB 左右的文件系统。

性能指标:

    基线聚合吞吐量 突发聚合吞吐量 最大突发持续时间 % 的时间文件系统可以突发(每天)

Checkout the performance documentation 了解有关每个指标的增加如何起作用的更多信息。

在非 Windows 服务器上,您可以使用以下脚本生成虚拟数据以增加文件系统大小:

#!/bin/bash 
COUNTER=0
while [ $COUNTER -lt $1 ]; do
    # Use DD to generate 1MB of data 1024 times from /dev/zero and add the newly created file to $2/N.txt
    dd if=/dev/zero of=$2/$COUNTER.txt bs=1048576 count=1024
    echo "Added file $COUNTER.txt to $2/"
    ((COUNTER++))
done

# Save this file as create.sh
# Be sure to run: sudo chmod +x create.sh

如果您打算从安装了 EFS 文件系统的 EC2 实例运行此脚本,我的建议是使用具有高网络性能的 EC2 实例。这将有助于减少为时间紧迫的人生成文件所需的时间。

使用以下命令调用脚本:create.sh 256 "/mnt/efs-directory/dummy"

注意: 运行上述命令意味着您将生成 256 个文件,每个文件 1GB。如果您希望拥有更小或更大的数据量,只需将 256 更改为您想要的文件系统大小即可。


您可以做的其他一些事情是:

    如果使用 Elastic Beanstalk,请为负载均衡器生成 CloudFront 分配 从 WordPress 中删除不必要的插件 为 Apache 或 nginx 安装缓存 (OPCache)

如果您选择hook it up,CloudWatch 中有一个可用于 EFS 的仪表板。它包含了解文件系统性能所需的所有指标。

【讨论】:

以上是关于AWS EFS 的性能下降的主要内容,如果未能解决你的问题,请参考以下文章

AWS 存储服务(EBS, S3, EFS)详细介绍和对比

Linux下NFS上的并行文件写入性能

对等方重置连接:AWS EFS

更改现有 EFS 的加密密钥

AWS Cloudformation - 在 EFS 中创建初始文件夹

我们可以在 AWS ECS docker 容器上挂载 EFS 吗?