添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

遇到一个使用AWS Cli进行AWS S3文件下载时速度慢的问题,AWS Cli是运行在Amazon Linux 2上,在AWS VPC里面直接执行aws s3 cp命令时发现下载速度往往只有100多MB/s,似乎并没有跑满AWS EC2的网络带宽和AWS EBS的I/O、吞吐量限制!那么这类问题我们应该怎么排查和优化呢?

  • AWS VPC的网络设置,建议打开 AW S3 Gateway endpoint ,这样EC2访问S3的流量就不需要通过NAT或者Internet Gateway走互联网了,而是直接留在VPC里面,这样更快、更稳定、更安全。而且AW S3 Gateway endpoint是免费的
  • AWS EC2限制:aws ec2的不同的类型有不同的网络带宽上限,详情请看 AWS EC2 instance types ,EC2的网络带宽都是5Gbps起步,一般可以达到500MB的理论下载速度;最入门的EC2 M5.large的EBS上限最高也有4750Mbps,也能到400M以上。所以绝大多数的非T系列机型的EBS带宽和网络带宽都能保证400MB的速度。
  • AWS EBS限制:AWS EBS的I/O和吞吐量也取决于我们的EBS磁盘类型和大小,如果我们选择的比较低过个的SSD盘或者吞吐量低的HDD盘,那么写入速度可能受到影响。详情请看 AWS EBS volume types
  • AWS Cli版本和配置, 这个是最重要的 ,本次的问题后面发现就是这个原因,后面详细分析
  • 本次的测试环境如下

  • AWS EC2为t3.large,挂载64GB的AWS EBS,EBS类型为GP2。所以这个EC2的规格比几乎所有的用户的配置都低一些,实际用户的测试环境远比我现在的好。
  • AWS VPC打开了S3 Gateway Endpoint。
  • AWS S3存放了5G左右测试文件(每个文件600M左右)做测试,EC2安装的系统为Amazon Linux 2023,附带AWS Cli2。
  • 系统详情:

    [ec2-user@ip-172-31-4-254 ~]$ uname -a
    Linux ip-172-31-4-254.cn-northwest-1.compute.internal 6.1.25-37.47.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Apr 24 23:20:16 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
    [ec2-user@ip-172-31-4-254 ~]$ aws --version
    aws-cli/2.9.19 Python/3.9.16 Linux/6.1.25-37.47.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off
    

    如果我们直接进行测试速度如下,大约160M/S

    如果我们分析原因,发现网络和EBS磁盘限制还没到,可以尝试继续分析原因,发现主要原因在AWS Cli配置。AWS Cli下载S3文件的速度主要问题在如下方面:

  • 如果你使用Amazon Linux 2,默认安装的是AWS Cli v1版本,这个版本比较老旧,首先你可以升级到AWS Cli2,详情请见:
  • 如果你使用Amazon Linux 2023,那么默认安装的是AWS Cli2;或者你现在的Linux是使用AWS Cli2,那么我们接着可以做如下的优化,详情见s3-config# aws s3 slow upload/download speed for bigfiles
  • 设置AWS Cli2 多线程下载:max_concurrent_requests可以设置为16或者更高一点
  • 设置AWS Cli2 的preferred_transfer_client,让Cli内置的Python性能得到提升
  • 设置max_bandwidthmultipart_thresholdmultipart_chunksize
  • 最后的详细设置如下

    [default]
    region = cn-northwest-1
    output = json
      max_concurrent_requests = 32
      max_queue_size = 10000
      multipart_threshold = 64MB
      multipart_chunksize = 16MB
      max_bandwidth = 500MB/s
      preferred_transfer_client = crt
    

    调整好后,我们继续测试,发现速度达到了310MB/s(其实观察到的最高速度有350+MB/s,换用其他更好的EC2和更好的磁盘轻松达到600+MB/S) image.png

    分类:
    后端
  •