Azure存储账号上传数百万文件时性能骤降问题排查
Azure Blob存储上传性能骤降及AzCopy OOM问题排查与解决
我有一台仅用于数据上传的VM,挂载4块4TB的StandardSSD_LRS磁盘,存储了200万+文件、总计约16TB数据,需上传至Azure存储账号的空容器中(已通过SAS URL授权)。使用AzCopy和Rclone上传时均出现上传数小时后性能骤降的情况,其中AzCopy在启动传输前就因OOM错误崩溃,Rclone无OOM但从监控可见存储账号侧存在限流现象。
使用的命令:
- AzCopy:
azcopy sync $SRC_ROOT $container_uri --recursive - Rclone(默认配置:4并行传输、4MB分块):
rclone copy $SRC_ROOT az:${storage_container_name} --config rclone.conf -v
核心原因分析
- 存储账号默认限流触发:标准通用v2存储账号默认请求速率上限为2万次/秒、带宽上限10Gbps,200万+小文件上传会产生大量PUT请求,前期请求量未达阈值时性能稳定,后期请求累积触发限流(429错误),导致传输速率骤降。
- AzCopy内存过载:
azcopy sync启动时会递归扫描所有本地文件并加载到内存生成对比列表,200万+文件直接耗尽VM内存引发OOM。 - Rclone默认配置不匹配场景:默认4并行传输、4MB分块的配置,对于大量小文件+大体积数据的场景,并行度不足且分块过小导致请求次数过多,加速触发限流。
针对性解决方案
1. AzCopy OOM问题修复
因为目标容器为空,无需同步对比,改用azcopy copy并分批上传避免内存过载:
# 生成所有文件的路径列表 find $SRC_ROOT -type f > full_file_list.txt # 将列表分割为每10000个文件一个批次(可根据VM内存调整) split -l 10000 full_file_list.txt batch_ # 循环上传每个批次 for batch_file in batch_*; do azcopy copy --list-of-files $batch_file $container_uri --recursive done
同时可通过环境变量限制AzCopy内存使用:
export AZCOPY_CONCURRENCY_VALUE=32 # 并发数,根据VM CPU调整 export AZCOPY_BUFFER_GB=4 # 限制内存缓冲区大小
2. Rclone性能优化(解决限流导致的性能骤降)
调整Rclone参数适配大文件+大量小文件场景:
rclone copy $SRC_ROOT az:${storage_container_name} --config rclone.conf -v \ --transfers 32 \ # 提升并行传输数(建议为VM CPU核心数的4倍) --checkers 64 \ # 提升文件检查并行数 --chunk-size 64M \ # 增大分块大小,减少大文件的请求次数 --multi-thread-streams 8 \# 大文件启用多线程上传 --retries 10 \ # 遇到限流时自动重试 --low-level-retries 20 # 底层请求重试次数
如果小文件占比极高,可启用--fast-list减少列表扫描的内存占用,或按目录分批上传,降低单批次请求量。
3. 存储账号层面优化
- 申请提高限制:如果是长期大流量传输,可通过Azure支持工单申请提高标准存储账号的请求速率和带宽上限。
- 切换高级存储:改用高级块Blob存储账号,默认支持5万次/秒请求速率和更高带宽,天生适配高吞吐量、大量小文件的传输场景。
验证方法
- 查看Azure存储账号监控中的
BlobThrottlingErrors指标,若错误数显著减少,说明限流缓解。 - 监控VM的CPU、内存、磁盘IO和网络带宽,确认资源未成为瓶颈。
内容的提问来源于stack exchange,提问作者Manish Gupta
相关产品推荐
相关产品推荐

