如何提升本地MacOS向AWS EC2传输大文件的速度?
一、立即生效的传输工具优化配置
1. 优化SCP命令(适合单文件传输)
默认SCP的TCP窗口和压缩策略不适合大文件,调整参数后可显著提升速度:
# 针对已压缩文件(如.safetensors),关闭压缩+调大TCP窗口 scp -i /path/key-pair-name.pem -o TCPWindowSize=65536 -o Compression=no /path/my-file.txt ec2-user@instance-public-dns-name:/path/ # 针对未压缩文本文件,开启压缩 scp -i /path/key-pair-name.pem -o TCPWindowSize=65536 -o Compression=yes /path/my-file.txt ec2-user@instance-public-dns-name:/path/
说明:TCPWindowSize调大可以减少TCP握手次数,提升大文件传输的吞吐量;已压缩文件再开启压缩会浪费CPU资源,拖慢速度。
2. 优化RSYNC命令(适合多文件/增量传输)
去掉无用的-z压缩参数(针对.safetensors这类已压缩文件),同时优化SSH参数:
rsync -av --progress --no-compress -e "ssh -i ${EC2_KEY} -o TCPWindowSize=65536 -o Ciphers=chacha20-poly1305@openssh.com" *.safetensors "${EC2_DNS}:/home/ubuntu/"
说明:chacha20-poly1305@openssh.com是CPU开销极低的加密算法,比默认的AES算法更快,尤其适合低配EC2实例。
3. 无加密快速传输(临时应急,注意安全)
如果不需要加密(或已通过VPN/安全组限制IP),可以用netcat跳过SSH加密,速度接近带宽上限:
- 先在EC2实例上启动监听:
nc -l 1234 > /home/ubuntu/my-file.txt
- 再在本地Mac上发送文件:
nc instance-public-dns-name 1234 < /path/my-file.txt
注意:传输完成后立即关闭EC2的1234端口,或在安全组中仅允许你的本地IP访问该端口。
二、瓶颈排查脚本/步骤
1. 测试网络链路丢包率
在Mac上运行,检查本地到EC2的网络稳定性:
ping -c 100 instance-public-dns-name
如果丢包率超过1%,说明网络链路存在拥堵或故障,需要联系网络提供商或AWS支持。
2. 测试实际TCP上传带宽
用iperf3测试真实的传输带宽(需先安装工具):
- EC2端安装并启动服务:
sudo apt update && sudo apt install -y iperf3 iperf3 -s
- 本地Mac端安装并测试:
brew install iperf3 iperf3 -c instance-public-dns-name -t 60
查看输出中的[ ID] Interval Transfer Bitrate行,sender对应的速度就是你的实际上传带宽,如果远低于10Mbps,说明是网络链路问题,而非传输工具的问题。
3. 测试EC2磁盘写入速度
检查EC2的磁盘是否成为瓶颈:
# 在EC2上运行,测试临时磁盘写入速度 dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct
如果写入速度低于10MB/s,说明EC2的磁盘性能不足,可考虑更换为gp3或io2磁盘(需联系账户所有者调整)。
4. 检查SSH加密算法开销
查看当前SSH使用的加密算法,确认是否使用了高开销算法:
# 在Mac上运行,连接EC2时查看加密算法 ssh -i ${EC2_KEY} -v ${EC2_DNS} 2>&1 | grep "cipher"
如果显示的是aes256-gcm@openssh.com等高开销算法,切换到chacha20-poly1305@openssh.com可降低CPU占用,提升传输速度。
内容的提问来源于stack exchange,提问作者Napat Lilit

