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('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 設定連接配接逾時時間為30秒。
bucket = oss2.Bucket(auth, endpoint, '<yourBucketName>', 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)
ending
如果發現上述方法都試過,但是吞吐率還是上不去,可以用 iftop 指令分析下,并且同時跑多個程式多程序運作将網絡帶寬打滿;
如果多程序也打不滿,那就要查自己的機器帶寬是否限制了上行流量,或者自己機器帶寬被打滿;