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
-
cloud_url [options]
显示bucket或者object的描述信息
set-acl cloud_url [acl] [options]
设置bucket或者objects的acl
set-meta cloud_url [meta] [options]
设置已上传的objects的元信息
-
src_url dest_url [options]
上传,下载或拷贝Objects
-
cloud_url [options]
恢复冷冻状态的Objects为可读状态
create-symlink cloud_url target_url [options]
创建符号链接
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的tag配置
bucket-encryption bucket_url [options]
设置、查询或者删除bucket的encryption配置
cors-options oss_url [options]
向oss发送http options请求,用于CORS检测
-
bucket_url local_xml_file [options]
设置、查询或者删除bucket的lifecycle配置
-
bucket_url local_xml_file [options]
设置、查询或者删除bucket的website配置
bucket-qos bucket_url [local_xml_file] [options]
设置、查询或者删除bucket的qos配置
user-qos [local_file] [options]
查询用户的qos配置
bucket-versioning bucket_url [versioning_parameter] [options]
设置、查询bucket的versioning配置
-
bucket_url [options]
获取bucket或者指定前缀(目录)所占的存储空间大小
bucket-policy bucket_url [local_json_file] [options]
设置、查询或者删除bucket的policy配置
request-payment bucket_url [payment_parameter] [options]
设置、查询bucket的访问者付费配置
object-tagging cloud_url [tag_parameter] [options]
设置、查询或者删除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 。降低线程数,上传的效率也会受到影响;