开发者社区> 问答> 正文

OSS python SDK 调优有哪些?

OSS python SDK 调优有哪些

展开
收起
1358896759097293 2021-03-11 10:12:41 1416 0
2 条回答
写回答
取消 提交回答
  • 下一站是幸福

    python 和 java 或者和 GO ,在性能上来说都不是最好的,而且 python 无法支持多核的并发,只能跑在单核上的多线程。但是 oss 也提供了相应的方法提高多线程的文件吞吐; 初始化

    在初始化时 python 有两个地方可以做调整 connect_timeout

    可以增大客户端在数据读写过程中的超时时间,常用在客户端到 OSS 公网情况下上传大文件时增长时间,防止在公网抖动或者丢包情况下出现传输超时;

    # -*- coding: utf-8 -*-
    import oss2
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId
    
    2021-03-14 22:23:14
    赞同 展开评论 打赏
  • 45271990@qq.com

    初始化 在初始化时 python 有两个地方可以做调整。 connect_timeout 可以增大客户端在数据读写过程中的超时时间,常用在客户端到 OSS 公网情况 下上传大文件时增长时间,防止在公网抖动或者丢包情况下出现传输超时。

    -- coding: utf-8 --

    import oss2

    阿里云主账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 账号进

    行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 账号。 auth = oss2.Auth(' ', ' ')

    Endpoint 以杭州为例,其它 Region 请按实际情况填写。

    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

    设置连接超时时间为 30 秒。

    bucket = oss2.Bucket(auth, endpoint, ' ', connect_timeout=30) 防劫持 OSS 服务端默认支持了泛域名的证书,客户可以用 https 协议传输方式出现被 劫持的情况。

    # -*- coding: utf-8 -*-
    import oss2
    # 阿里云主账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 账号进
    行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint 以杭州为例,其它 Region 请按实际情况填写。将 http 改为 https 就是走 https 加 密
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    bucket = oss2.Bucket(auth, endpoint, '<yourBucketName>')
    

    性能调优 enable_crc crc 的作用是校验客户端的文件完整性,文件越大对 cpu 计算消耗越高,上传时 间成本越高,所以一般都建议用户端,关闭 crc 提高传输效率,使用 Content-Md5 的方式替代 crc64。

    # -*- coding: utf-8 -*-
    import oss2
    # 阿里云主账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 账号进
    行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint 以杭州为例,其它 Region 请按实际情况填写。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    bucket = oss2.Bucket(auth, endpoint, '<yourBucketName>', enable_crc=False)
    
    

    日志开关 OSS 的日志采用 logging 模块采集。通过 ossclient 初始化时 set logging 的 开关和存放位置;但是记录日志的同时会影响 SDK 上传性能,一般不建议用户开启, 排查问题时采用到;平常客户只要记录 requestID 或者 OSS 返回的 header 头就足 够了。

    # -*- coding: utf-8 -*-
    import os
    import logging
    import oss2
    from itertools import islice
    # 初始化 AccessKeyId、AccessKeySecret、Endpoint 等信息。
    # 请将 <AccessKeyId>、<AccessKeySecret>、<Bucket> 及 < 访问域名 > 分别替换成对应的具体
    信息。
    access_key_id = '<AccessKeyId>'
    access_key_secret = '<AccessKeySecret>'
    bucket_name = '<Bucket>'
    endpoint = '< 访问域名 >'
    log_file_path = "log.log"
    # 开启日志
    oss2.set_file_logger(log_file_path, 'oss2', logging.INFO)
    # 创建 Bucket 对象。
    bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, 
    bucket_name)
    # 遍历文件目录
    for b in islice(oss2.ObjectIterator(bucket), 10):
     print(b.key)
    # 获取文件元信息
    object_meta = bucket.get_object_meta('object')
    
    

    分片上传下载 python SDK 在 分片的基础上增加了断点传输,既可以在分片基础上增加并发, 也支持断点记录的功能,在遇到网络问题断开时不需要每次从文件开始重传,从记录 断点的位置继续传输。 分片大小建议 100M,1M 分片 1000M,10M 分片 10G,100M 分片 100G,1G 分片 .... 断点上传

    # -*- coding: utf-8 -*-
    import oss2
    # 阿里云主账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 账号进
    行 API 访问或日常运维,请登录 https://ram.console.aliyun.com 创建 RAM 账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint 以杭州为例,其它 Region 请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 
    '<yourBucketName>')
    # 当文件长度大于或等于可选参数 multipart_threshold(默认值为 10MB)时,会使用分片上传。如
    未使用参数 store 指定目录,则会在 HOME 目录下建立 .py-oss-upload 目录来保存断点信息。
    oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>')
    # 如使用 store 指定了目录,则保存断点信息在指定目录中。如使用 num_threads 设置上传并发数,
    请将 oss2.defaults.connection_pool_size 设成大于或等于线程数。默认线程数为 1。
    oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>',
     store=oss2.ResumableStore(root='/tmp'),
     multipart_threshold=100*1024,
     part_size=100*1024,
     num_threads=4)
    

    断点下载

    # -*- coding: utf-8 -*-
    import oss2
    # 阿里云主账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 账号进
    行 API 访问或日常运维,请登录 https://ram.console.aliyun.com 创建 RAM 账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint 以杭州为例,其它 Region 请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 
    '<yourBucketName>')
    # 请将 oss2.defaults.connection_pool_size 设成大于或等于线程数,并将 part_size 参数设
    成大于或等于 oss2.defaults.multiget_part_size。
    oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>',
     store=oss2.ResumableDownloadStore(root='/tmp'),
     multiget_threshold=20*1024*1024,
     part_size=10*1024*1024,
     num_threads=3)
    
    

    如果发现上述方法都试过,但是吞吐率还是上不去,可以用 iftop 命令分析下, 并且同时跑多个程序多进程运行将网络带宽打满;如果多进程也打不满,那就要查自 己的机器带宽是否限制了上行流量,或者自己机器带宽被打满。

    2021-03-14 22:49:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载