性能调优-ossutil 调优

ossutil 能做什么

功能概述

ossutil 是 go 编写的命令行高效快捷工具,工具执行效率、支持功能、容错功能无疑是运维必备首选,同时在弱网条件下支持探测模式,测试客户端的网络上下行速率;

  • ossutil 专司于高并发大文件或小文件读写的场景,同时支持大文件内部进行分片时的并发;
  • 操作文件时可以支持 include exinclude 参数,指定哪些后缀的文件可被操作;
  • 只显示当前的层级的目录,可选择性的进行递归;
  • 伴随 Linux 系统本身的 crontab 使用支持,强制更新 -f -u 参数;
  • 限制 ossutil 的操作速度;

支持选项

Commands:

  • mb cloud_url [options]

      创建Bucket
  1. [cloud_url] [options]

      列举Buckets或者Objects
  2. cloud_url [options]

      删除Bucket或Objects
  3. cloud_url [options]

      显示bucket或者object的描述信息

    set-acl cloud_url [acl] [options]

      设置bucket或者objects的acl

    set-meta cloud_url [meta] [options]

      设置已上传的objects的元信息
  4. src_url dest_url [options]

      上传,下载或拷贝Objects
  5. cloud_url [options]

      恢复冷冻状态的Objects为可读状态

    create-symlink cloud_url target_url [options]

      创建符号链接

    read-symlink cloud_url [options]

      读取符号链接文件的描述信息
  6. cloud_url [meta] [options]

      生成object下载链接
  7. file_name [options]

      探测命令,支持多种功能探测
  8. dir_name [options]

      创建一个目录,在oss中目录名字有后缀字符'/'
  9. bucket_url [local_xml_file] [options]

      设置、查询或者删除bucket的cors配置
  10. src_bucket_url target_bucket_url [options]

      设置、查询或者删除bucket的log配置
  11. bucket_url referer [options]

      设置、查询或者删除bucket的referer配置
  12. oss_object uploadid [options]

      列出没有完成分块上传的object的分块信息
  13. bucket_url [options]

      获取bucket所有未完成上传的multipart object的分块大小以及总和
  14. local_file_name oss_object [options]

      将本地文件内容以append上传方式上传到oss中的appendable object中
  15. 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检测
  16. bucket_url local_xml_file [options]

      设置、查询或者删除bucket的lifecycle配置
  17. 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配置
  18. 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

性能调优-ossutil 调优

如图用户在操作解冻文件的过程中出现 403,可能与两个原因有关系

1、用户使用的子账号操作文件,权限不够。

2、用户的文件是违禁内容被封禁掉了。

3、遇到 403 时,递归解冻会中断不会继续。这种现象是正常的,工具在设计之初就是考虑到如果文件遇到 403 的话,代表没有权限操作该文件,那么通过该账号下的其他文件也操作不了,所以就会中断退出。

访问 OSS 出现 400

性能调优-ossutil 调优

检查用户的命令和官方提供的命令是否完全一致,避免误操作。
使用 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 内网是有阿里环网组成,如果客户只能在公网使用,进行下面的排查。

性能调优-ossutil 调优

公网情况:

首先看下用户端 ping OSS 的完整域名的网络 ping 值是否正常,tracert 是否有延迟抖动,此步骤可以通过脚本来做,下载脚本后运行,直接输入完整的 OSS 域名即可:测试脚本

1、脚本中是 ping 的是大包 1460,发现用户端直接网络超时,此时怀疑是客户的网络有限制或者网络拥塞,但是 tracert 通的,再进行下一步排查;

性能调优-ossutil 调优

2、尝试降低 ping 包的 len 发现到 1412 ping 可以通过,说明客户端在网络上做限制,不允许 1460 大包的传输,影响了客户端的上行网络吞吐量;

性能调优-ossutil 调优

尝试检查本机的网络负载

1、通过本机资源监控看用户端当时的 CPU 负载和本机内存占用较高,实际登陆到客户端机器上发现系统卡顿,实际资源监控器看到 ossutil 工具线程并没有跑到和设置的 --job=10 --parallel=10 (10*10=100)一样,只是运行了 24 个,说明工具的线程受到了系统 CPU 调度影响,无法将网络吞吐打上去,于是让用户关系了一些占用 CPU 内存较高的应用后,ossutil 线程数终于打到 69;

调整前的测试

性能调优-ossutil 调优

调整后的测试

性能调优-ossutil 调优

灵活调整 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 。降低线程数,上传的效率也会受到影响;

上一篇:Confluence 6 升级自定义的站点和空间应用你的自定义布局


下一篇:c++类的实例化,有没有new的区别