摘要:?經常碰到內部同學或者外部客戶問ossutil關于并發上傳性能的問題。本文簡單描述下ossutil并發上傳原理并舉例說明。 用戶可從這里獲取ossutil。 官網:https://help.aliyun.com/document_detail/50452.html代碼:https://github.com/aliyun/ossutil 參數 --recursive 上傳文件到oss時,如果file_url為目錄,則必須指定--recursive選項,否則無需指定--recursive選項。
經常碰到內部同學或者外部客戶問ossutil關于并發上傳性能的問題。本文簡單描述下ossutil并發上傳原理并舉例說明。
用戶可從這里獲取ossutil。
官網:https://help.aliyun.com/document_detail/50452.html
代碼:https://github.com/aliyun/ossutil
參數
--recursive
上傳文件到oss時,如果file_url為目錄,則必須指定--recursive選項,否則無需指定--recursive選項。
從oss下載或在oss間拷貝文件時
如果未指定--recursive選項,則認為拷貝單個object,此時請確保src_url精確指定待拷貝的object,如果object不存在,則報錯。
如果指定了--recursive選項,ossutil會對src_url進行prefix匹配查找,對這些objects批量拷貝,如果拷貝失敗,已經執行的拷貝不會回退。
在進行批量文件上傳(或下載、拷貝)時,如果其中某個文件操作失敗,ossutil不會退出,而是繼續進行其他文件的上傳(或下載、拷貝)動作,并將出錯文件的錯誤信息記錄到report文件中。成功上傳(或下載、拷貝)的文件信息將不會被記錄到report文件中。
批量操作出錯時終止運行的情況
如果未進入批量文件迭代過程,錯誤已經發生,則不會產生report文件,ossutil會終止運行。如,用戶輸入cp命令出錯時,不會產生report文件,而是屏幕輸出錯誤并退出。
如果批量操作過程某文件發生的錯誤為:Bucket不存在、accessKeyID/accessKeySecret錯誤造成的權限驗證非法等錯誤,ossutil會屏幕輸出錯誤并退出。
report文件名為:ossutil_report_日期_時間.report。report文件是ossutil輸出文件的一種,被放置在ossutil的輸出目錄下,該目錄的路徑可以用配置文件中的outputDir選項或命令行--output-dir選項指定,如果未指定,會使用默認的輸出目錄:當前目錄下的ossutil_output目錄。
ossutil不做report文件的維護工作,請自行查看及清理用戶的report文件,避免產生過多的report文件。
并發控制參數
--jobs選項控制多個文件上傳/下載/拷貝時,文件間啟動的并發數
--parallel控制上傳/下載/拷貝大文件時,分片間的并發數。
默認情況下,ossutil會根據文件大小來計算parallel個數(該選項對于小文件不起作用,進行分片上傳/下載/拷貝的大文件文件閾值可由--bigfile-threshold選項來控制),當進行批量大文件的上傳/下載/拷貝時,實際的并發數為jobs個數乘以parallel個數。該兩個選項可由用戶調整,當ossutil自行設置的默認并發達不到用戶的性能需求時,用戶可以自行調整該兩個選項來升降性能。
--bigfile-threshold參考詳情,請參考ossutil大文件斷點續傳
--part-size選項
該選項設置大文件分片上傳/下載/拷貝時,每個分片的大小。
默認情況下,不需要設置該值,ossutil會根據文件大小自行決定分片大小和分片并發,當用戶上傳/下載/拷貝性能達不到需求時,或有其他特殊需求時,可以設置這些選項。
如果設置了該選項(分片大小),分片個數為:向上取整(文件大小/分片大小),注意如果--parallel選項值大于分片個數,則多余的parallel不起作用,實際的并發數為分片個數。
如果將part size值設置得過小,可能會影響ossutil文件上傳/下載/拷貝的性能,設置得過大,會影響實際起作用的分片并發數,所以請合理設置part size選項值。
性能調優
如果并發數調得太大,由于線程間資源切換及搶奪等,ossutil上傳/下載/拷貝性能可能會下降,所以請根據實際的機器情況調整這兩個選項的數值,如果要進行壓測,可以一開始將兩個數值調低,慢慢調大尋找最優值。
如果--jobs選項和--parallel選項值太大,在機器資源有限的情況下,可能會因為網絡傳輸太慢,產生EOF錯誤,這個時候請適當降低--jobs選項和--parallel選項值。
如果文件數太多大小有不太平均,直接同時使用--jobs=3 --parallel=4進行設定(文件間并發為3,單文件內的并發為4),同時觀察MEM, CPU,網絡情況,若并未打滿網絡、占滿CPU,則可以繼續上調--jobs和--parallel。
真實案例
根據當時客戶場景,下載速度大概在265M/s。
案例解析
在默認情況下,因為是多文件下載,所以會同時下載5個文件(version<=1.4.0,文件間的并發數為5)。
因為平均每個文件大小在1.1G,默認會為每個下載的文件開12個線程(單個文件內的并發數為12,在沒有設置parallel參數和partsize參數時會根據文件大小計算出)。
那么在客戶的環境里ossutil在運行期間至少有5*12= 60 個線程在跑。這么多并發應該會直接打滿網卡,CPU應該也很擁擠。建議在并發下載時觀察環境CPU,網絡,進程/線程情況。
根據客戶的截圖,建議對每個文件分片100M~200M進行并發,比如設為100M每個分片,這樣每個文件下載的并發數就是filesize/partsize。
ossutil cp oss://xxx xxx -r --part-size=102400000
如果文件數太多大小有不太平均,直接同時使用--jobs=3 --parallel=4進行設定(文件間并發為3,單文件內的并發為4)
總的建議就是:jobs * parallel 與CPU核數為1:1,2:1,但不要太大。
進一步解釋
不是oss需要多少資源,是每個并發(讀取文件,分片,上傳等操作)所需的CPU,mem,網絡等。
--jobs是多文件間的并發度,默認是5(version <= 1.4.0,之后是3)
--parallel是大文件內部分片并發度,在沒有設置parallel參數和partsize參數時會根據文件大小計算出,最大不會超過15(version <= 1.4.0,之后是12)
如果文件數太多大小又不太平均,可以同時使用--jobs=3 --parallel=4進行設定(文件間并發為3,單文件內的并發為4,具體數字根據機器情況調整)
小結
cp默認并發執行,cp大文件用分片并發下載,小文件用put;默認開啟CRC校驗。
在oss間拷貝文件,目前只支持拷貝object,不支持拷貝未complete的Multipart。
總的建議
jobs * parallel 與CPU核數為1:1,2:1,但不要太大
并發數太多會直接打滿網卡,CPU也會擁擠。建議在并發時觀察環境CPU,網絡,進程/線程情況
Reference
本文為云棲社區原創內容,未經允許不得轉載。
評論
查看更多