python 断点重传_性能调优-python SDK 调优-阿里云开发者社区

python SDK

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

初始化

在初始化时 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('', '')

# Endpoint以杭州为例,其它Region请按实际情况填写。将 http 改为 https 就是走 https 加密

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

bucket = oss2.Bucket(auth, endpoint, '')

性能调优

enable_crc

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

# -*- coding: utf-8 -*-

import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。

auth = oss2.Auth('', '')

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

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

bucket = oss2.Bucket(auth, endpoint, '', 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等信息。

# 请将、、及分别替换成对应的具体信息。

access_key_id = ''

access_key_secret = ''

bucket_name = ''

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('', '')

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

bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')

# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。

oss2.resumable_upload(bucket, '', '')

# 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。

oss2.resumable_upload(bucket, '', '',

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('', '')

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

bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')

# 请将oss2.defaults.connection_pool_size设成大于或等于线程数,并将part_size参数设成大于或等于oss2.defaults.multiget_part_size。

oss2.resumable_download(bucket, '', '',

store=oss2.ResumableDownloadStore(root='/tmp'),

multiget_threshold=20*1024*1024,

part_size=10*1024*1024,

num_threads=3)

ending

如果发现上述方法都试过,但是吞吐率还是上不去,可以用 iftop 命令分析下,并且同时跑多个程序多进程运行将网络带宽打满;

如果多进程也打不满,那就要查自己的机器带宽是否限制了上行流量,或者自己机器带宽被打满;

你可能感兴趣的:(python,断点重传)