Azure Blob Storage异步批量上传E2E耗时优化咨询
问题
我正在向Azure存储账户(StorageV2通用v2)的容器中并发上传1500个Blob(单个Blob最大1MB)。目前使用Python的azure-blob_storage包实现异步上传,伪代码如下:
async def upload_blobs_async(blobs_args:list): tasks = [asyncio.create_task(upload_blob_async(blob_arg)) for arg in blobs_args] # concurrent call return_when all completed. Safe. finished, pending = await asyncio.wait( tasks, return_when=asyncio.ALL_COMPLETED ) return None .... async def upload_blob_async(args: dict): # Instantiate a new BlobServiceClient using a connection string blob_service_client = asyncbsc.from_connection_string(CONNECTION_STRING_STORAGE) async with blob_service_client: # Instantiate a new ContainerClient container_client = blob_service_client.get_container_client(args["blob_name"]) # Upload a blob to the container await container_client.upload_blob(...)
在不限制并发请求数量的情况下,上传1500个文件对端到端(E2E)响应时间造成了极大影响。请问如何降低E2E耗时?比如使用信号量将并发请求限制为每次100个?另外,由于需要使用Blob标签(高级存储账户不支持该功能),我必须保留通用存储账户。
优化方案
1. 通过信号量控制并发数
无限制并发会引发请求排队、网络拥塞,反而拖慢整体上传速度。用asyncio.Semaphore限定并发量是直接有效的优化手段,建议先尝试100-200的并发值(可根据实际运行环境微调)。修改后的核心代码示例:
async def upload_blobs_async(blobs_args: list): # 限制同时执行的上传任务数为100 semaphore = asyncio.Semaphore(100) async def bounded_upload(arg): async with semaphore: await upload_blob_async(arg) tasks = [asyncio.create_task(bounded_upload(arg)) for arg in blobs_args] await asyncio.gather(*tasks) return None
2. 复用客户端实例减少开销
当前代码每个上传任务都新建BlobServiceClient,会频繁创建销毁HTTP连接,带来不必要的性能损耗。应该全局初始化一次BlobServiceClient,并针对同一容器复用ContainerClient:
# 全局仅初始化一次BlobServiceClient blob_service_client = asyncbsc.from_connection_string(CONNECTION_STRING_STORAGE) async def upload_blob_async(args: dict): # 注意:原代码中get_container_client的参数应为容器名,而非Blob名称,此处修正 container_client = blob_service_client.get_container_client(args["container_name"]) await container_client.upload_blob(args["blob_name"], args["blob_data"], ...)
3. 调整上传参数优化细节
- 单个Blob最大1MB,无需分块上传,可设置
overwrite=True(如果允许覆盖同名Blob),避免额外的Blob存在性检查开销。 - 确保
upload_blob的tags参数正确传入,满足业务需求的同时不额外消耗资源。
4. 网络与环境优化
- 保证运行代码的虚拟机/服务器与Azure存储账户处于同一区域,最大限度降低网络延迟。
- 检查本地机器的网络带宽,避免带宽不足成为上传瓶颈。
内容的提问来源于stack exchange,提问作者orville
相关产品推荐
相关产品推荐

