ossutil 能做什麼
功能概述
ossutil 是 go 編寫的指令行高效快捷工具,工具執行效率、支援功能、容錯功能無疑是運維必備首選,同時在弱網條件下支援探測模式,測試用戶端的網絡上下行速率;
- ossutil 專司于高并發大檔案或小檔案讀寫的場景,同時支援大檔案内部進行分片時的并發;
- 操作檔案時可以支援 include exinclude 參數,指定哪些字尾的檔案可被操作;
- 隻顯示目前的層級的目錄,可選擇性的進行遞歸;
- 伴随 Linux 系統本身的 crontab 使用支援,強制更新 -f -u 參數;
- 限制 ossutil 的操作速度;
支援選項
Commands:
- mb cloud_url [options]
建立Bucket
- [cloud_url] [options]
列舉Buckets或者Objects
- cloud_url [options]
删除Bucket或Objects
-
set-acl cloud_url [acl] [options]顯示bucket或者object的描述資訊
set-meta cloud_url [meta] [options]設定bucket或者objects的acl
設定已上傳的objects的元資訊
- src_url dest_url [options]
上傳,下載下傳或拷貝Objects
-
create-symlink cloud_url target_url [options]恢複冷凍狀态的Objects為可讀狀态
read-symlink cloud_url [options]建立符号連結
讀取符号連結檔案的描述資訊
- cloud_url [meta] [options]
生成object下載下傳連結
- file_name [options]
探測指令,支援多種功能探測
- dir_name [options]
建立一個目錄,在oss中目錄名字有字尾字元'/'
- bucket_url [local_xml_file] [options]
設定、查詢或者删除bucket的cors配置
- src_bucket_url target_bucket_url [options]
設定、查詢或者删除bucket的log配置
- bucket_url referer [options]
設定、查詢或者删除bucket的referer配置
- oss_object uploadid [options]
列出沒有完成分塊上傳的object的分塊資訊
- bucket_url [options]
擷取bucket所有未完成上傳的multipart object的分塊大小以及總和
- local_file_name oss_object [options]
将本地檔案内容以append上傳方式上傳到oss中的appendable object中
- object [options]
bucket-tagging bucket_url [tag_parameter] [options]将檔案内容輸出到标準輸出
bucket-encryption bucket_url [options]設定、查詢或者删除bucket的tag配置
cors-options oss_url [options]設定、查詢或者删除bucket的encryption配置
向oss發送http options請求,用于CORS檢測
- bucket_url local_xml_file [options]
設定、查詢或者删除bucket的lifecycle配置
-
bucket-qos bucket_url [local_xml_file] [options]設定、查詢或者删除bucket的website配置
user-qos [local_file] [options]設定、查詢或者删除bucket的qos配置
bucket-versioning bucket_url [versioning_parameter] [options]查詢使用者的qos配置
設定、查詢bucket的versioning配置
-
bucket-policy bucket_url [local_json_file] [options]擷取bucket或者指定字首(目錄)所占的存儲空間大小
request-payment bucket_url [payment_parameter] [options]設定、查詢或者删除bucket的policy配置
object-tagging cloud_url [tag_parameter] [options]設定、查詢bucket的通路者付費配置
設定、查詢或者删除object的tag配置
Additional Commands:
help [command]
擷取指令的幫助文檔
config [options]
建立配置檔案用以存儲配置項
hash file_url [options]
計算本地檔案的crc64或md5
update [options]
更新ossutil
場景分類
ossutil help
拷貝單個小文檔案
ossutil cp $localfile oss://$bucket/ -i $AccesskeyID -k $AccesskeySecretkey -e $endpoint
遞歸拷貝本地目錄小檔案到 oss
ossutil cp -r $local_path oss://$bucket/ -i $AccesskeyID -k $AccesskeySecretkey -e $endpoint
拷貝單個大文檔案
ossutil cp $localfile oss://$bucket/ --part-size=50000000 --bigfile-threshold=54857600 --parallel=5 -i $AccesskeyID -k $Accesskey Secretkey -e $endpoint
遞歸拷貝本地目錄大檔案到 oss
ossutil cp $localfile oss://bucket/ --part-size=50000000 --bigfile-threshold=54857600 --jobs=20 --parallel=5 -i $AccesskeyID -k $AccesskeySecretkey$ -e $endpoint
常見問題
oss 上傳下載下傳慢
1、如果能穩定複現可以用 --loglevel 參數 debug 請求過程,将記錄的 OSS 傳回的 requestID 回報到阿裡雲售後排查;
2、客戶可以使用 probe 探測指令生成一個網絡探測報告,通過檢測結果看下用戶端網絡是否存在慢請求的問題;
3、如果用戶端是 ECS ,并且和 OSS 是同 region ,可以使用内網的 endpoint 進行傳輸,内網傳輸速率一般可以達到 50M -100M 左右(自己測試),比如北京的 OSS 内網 endpoint 就是 oss-cn-beijing-internal.aliyuncs.com
4、用戶端可以在使用上面推薦的大檔案見分片上傳,下載下傳的功能,如果檔案數量多,可以同時增加并發參數提高網絡吞吐;
5、如果用戶端還是存在慢的問題,可以用 wireshark 或者 tcpdump 抓包分析下找出慢的瓶頸;
ossutil 出現 skip 情況
[root@iZ2Sv4olcc4Z opt]# echo “testlil” > dskydb/test.txt
[root@iZ25v4olcc4Z opt]# ./ossutil64 cp -rt -c ~/.ossuti.Lcofig dskyclb/test.txt oss://gres/test.txt
Succeed: Total nun: 1, $ze: 30. OK nun: 1(upload 1 files).
0.372650(s) elapsed I
[root@iZ2Sv4olcc4Z opt] echo " ttest222r" >> dskydb/test.txt
[root@iZ2Sv4olcc4Z opt]. /ossutil64 cp —u —c ~/.ossutilconfig cbkydb/test.txt oss://gres/test.txt
Succeed: Total num: 1, ize: 38. OK nun: l(skip 1 files), Skip sin 38.
0.252878(s) elapsed
1、使用 -u 強制更新時,重新對所有的上傳檔案和原的進行一次比對,發現美有更改的情況就會跳過,有發生更改的就會觸發上傳進行覆,正常情況。
2、遇到這種情況可以看下本地的 log 哪些檔案被跳過了,将 oss 存儲的檔案和本地檔案做個 MD5 比對確定檔案是一緻。
3、指令:./ossutil64 cp -u -r -f aa.test oss://alihua -i $accesskeyID -k $accesskeyIDSecret -e $endpoint
ossutil 通路出現 403

如圖使用者在操作解凍檔案的過程中出現 403,可能與兩個原因有關系
1、使用者使用的子賬号操作檔案,權限不夠。
2、使用者的檔案是違禁内容被封禁掉了。
3、遇到 403 時,遞歸解凍會中斷不會繼續。這種現象是正常的,工具在設計之初就是考慮到如果檔案遇到 403 的話,代表沒有權限操作該檔案,那麼通過該賬号下的其他檔案也操作不了,是以就會中斷退出。
通路 OSS 出現 400
檢查使用者的指令和官方提供的指令是否完全一緻,避免誤操作。
使用 stat 選項看一下檔案的狀态是否是已經解凍了,如果以及解凍再次操作,就會出現 400。
The operation is not valid for the object's state
出現這個問題是因為使用者操作的檔案是一個歸檔的檔案,不能直接操作,需要先進行解凍 restore 的操作後才能使用。
- ossuti64 restore oss://bucket/prefix/object -I $accesskey -k $secretkey -e $endpoint
- 遞歸解凍 ossuti64 restore oss://bucket/prefix/ -r -I $accesskey -k $secretkey -e $endpoint
上傳速率不穩定
Windows ossutil 上傳 OSS 速率慢不穩定,用戶端是在河北公網,目标服務端是北京,存在跨省情況;
首先了解下使用者在公網情況下,能否切換到同 region 的 OSS 上進行通路,同 region 的 OSS 内網是有阿裡環網組成,如果客戶隻能在公網使用,進行下面的排查。
公網情況:
首先看下使用者端 ping OSS 的完整域名的網絡 ping 值是否正常,tracert 是否有延遲抖動,此步驟可以通過腳本來做,下載下傳腳本後運作,直接輸入完整的 OSS 域名即可:
測試腳本1、腳本中是 ping 的是大包 1460,發現使用者端直接網絡逾時,此時懷疑是客戶的網絡有限制或者網絡擁塞,但是 tracert 通的,再進行下一步排查;
2、嘗試降低 ping 包的 len 發現到 1412 ping 可以通過,說明用戶端在網絡上做限制,不允許 1460 大包的傳輸,影響了用戶端的上行網絡吞吐量;
嘗試檢查本機的網絡負載
1、通過本機資源監控看使用者端當時的 CPU 負載和本機記憶體占用較高,實際登陸到用戶端機器上發現系統卡頓,實際資源監控器看到 ossutil 工具線程并沒有跑到和設定的 --job=10 --parallel=10 (10*10=100)一樣,隻是運作了 24 個,說明工具的線程受到了系統 CPU 排程影響,無法将網絡吞吐打上去,于是讓使用者關系了一些占用 CPU 記憶體較高的應用後,ossutil 線程數終于打到 69;
調整前的測試
調整後的測試
靈活調整 ossutil 的線程數和分片的并發數;
--bigfile-threshold=52428800 --jobs=10 --parallel=50 --part-size=52428800
1、遇到大檔案數量多,以及單一的大檔案時我們要靈活調整 ossutil 的相關參數能夠提高我們的 ossutil 的效率;
2、比如這個案例中客戶的檔案大小平均是 100M 以上,而且客戶的出口帶寬是共享 200M ,也就是客戶自己的上線速度理論上也要 20M;
3、針對這種情況,我們可以把分片大小調整為 50M-10M,同時增加 parallel 分片的并發數量,盡可能的打滿上行的吞吐。當用戶端 CPU 核心比較少的時候不建議分的太小,比如分到 1M 時就會造成 CPU 切片過快,消耗 CPU 計算,影響系統性能。
4、如果遇到檔案數量單一大檔案,或者小檔案時,可以不用加任何參數,直接上傳即可;調整完成後使用者的上行出口速率能打到 10M 大 B。
對比其他家的工具
比如七牛的 qfetch 以及 qshell 做了性能對比,上行的傳輸效率相差并不多,并沒有使用者回報了七牛 20M (大B)阿裡雲 4M(大B),基本上qshell 和 qfetch 的效果都是穩定在 10M 左右;
總結以及需要解決問題
1、當使用 ossbrower 上傳速度低時可以切換到 ossutil 這個高效的工具進行測試;
2、需要使用者解決下為什麼網絡出口限制的大包(1460) 的傳輸,這個問題不解決很難将網絡帶寬吞吐提上去。
盡量本機不要在負載高的情況下上傳一些大檔案,如果傳輸的話可以關閉一些應用卡頓的程式,或者降低下 ossutil 工具的并發線程數量,不然即使設定了 100 ,但實際受到系統的 CPU 調用影響,不一定能跑到 100 。降低線程數,上傳的效率也會受到影響;