遇到一个使用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
[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_bandwidth
,multipart_threshold
,multipart_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)