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