OSS上传或下载文件时速度很慢,怎么办?

本文介绍OSS上传和下载文件速度慢的原因和解决方法。

问题原因

OSS上传和下载速度主要受限于客户端本地的带宽以及运营商的网络链路。

解决方法

使用非SDK上传和下载文件速度慢的排查方法

  1. 检查上传和下载文件的方式。

    • 如果您是通过OSS控制台、ossfs、ossbrowser、ossftp等工具上传或下载文件较慢,建议您使用ossutil工具。ossutil工具支持上传大流量文件或者是数量较多的文件。更多信息,请参见cp(上传文件)cp(下载文件)

    • 如果使用ossutil工具上传或下载速度没有提升,请继续检查下一步。

  2. 检查网络的带宽和QPS是否超出限制。

    1. 登录OSS管理控制台

    2. 单击Bucket列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择用量查询>基础数据,检查网络的带宽和QPS是否超限。

      • 带宽:中国内地各地域10Gbit/s、其他地域5Gbit/s。如达到该阈值,请求会被流控。

      • QPS:10000次/s。如达到该阈值,超出的请求会被拒绝。

  3. 检查本地网络环境,使用MTR工具测试一下Bucket域名,查看客户端和服务器之间的链路是否有丢包情况。更多信息,请参见MTR工具使用说明与结果分析

    说明

    如果您是内网上传,请使用内网internal类型的Endpoint地址。

  4. 使用ossutil工具的probe命令检测下您的网络环境和上传速度,排查与OSS之间的网络状态。更多信息,请参见probe

  5. 确认上传的客户端设备与OSS所属的区域是否涉及跨境传输。

    例如OSSBucket在华东1(杭州),客户端所在地域为中国香港,这类场景客户端在上传时会受到跨境链路的限制,您可以开通OSS的传输加速。如需体验传输加速功能在不同Region对上传和下载的提升效果,您可以使用OSS互联网连通与测速工具

    OSS传输加速利用全球分布的云机房,将全球各地用户对您存储空间(Bucket)的访问,经过智能路由解析至就近的接入点,使用优化后的网络及协议,为云存储互联网的上传、下载提供端到端的加速方案。更多信息,请参见开启传输加速

    说明

    开启传输加速后,会在30分钟内全网生效。请确保配置的传输加速Endpoint地址正确。

    • 全球加速Endpoint:地址为oss-accelerate.aliyuncs.com。传输加速接入点分布在全球各地,全球各地的Bucket均可以使用该域名进行传输加速。

    • 非中国内地加速Endpoint:地址为oss-accelerate-overseas.aliyuncs.com。传输加速接入点分布在除中国内地以外的各地域,仅在中国香港及海外各地域Bucket绑定未备案的域名做CNAME指向时使用。

使用SDK上传和下载文件速度慢的排查方法

以通过OSS Python SDK上传文件速度较慢的排查方法为例:

  1. 如果您是上传大于100 MB的文件,建议您采用断点续传方式上传。更多信息,请参见分片上传和断点续传。如果您已采用断点续传方式上传,请继续执行下一步。

    使用断点续传时,请检查以下参数的设置,单位为Byte。

    • multipart_threshold:文件长度大于该值时,采用分片上传。

    • part_size:分片大小。您需要根据文件大小设置分片大小,例如1 GB以上的文件建议将part_size设置100 MB。

      说明

      网络情况较好时,建议增加分片大小。反之,减小分片大小。

    • num_threads为并发上传的线程数,通常num_threads设置为4。

    结合以上说明,建议配置如下:

    multipart_threshold=100*1024*1024,
    part_size=100*1024*1024,
    num_threads=4
  2. 检查是否开启了CRC验证。

    如果为开启状态,建议在初始化ossclient时关闭CRC校验,可以在请求头中增加Content-MD5的方式使用MD5替换crc64。关于初始化Python SDK的更多信息,请参见Python SDK初始化

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量。
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    
    # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = 'yourEndpoint'
    # 填写Bucket名称,例如examplebucket。
    # enable_crc=False表示关闭crc64校验。
    bucket = oss2.Bucket(auth, endpoint, 'examplebucket',enable_crc=False)  
    说明

    crc64仅用于校验数据,不保证数据安全性。