zoukankan      html  css  js  c++  java
  • 亚马逊s3存储: aws cli上传工具速度和各文件大小关系探究

    1,背景介绍

    公司最近最近统一了存储环境,由ftp文件存储全量转换为ceph存储。有业务组表示以前往ftp文件批量上传30万个文件1.3GB只需要16分钟左右。切换为ceph存储需要1个多小时,也就是现在现有的速度只有369kb/s。询问能如何改进。

    公司内部网络和存储环境进行了压力测试。
    ceph 存储系统调研读写性能测试的报告如下

    我们是采用s3的接口进行文件上传的,也就是对于上面的cephrgw的接口。大概在20MB/s的速度。

    2,首先我使用java程序进行验证。

    发现他发给我的数据集确实以很慢的速度进行上传。和普通的文件上传具有10倍的差距左右。在调整aws-java-s3的sdk的线程池的大小后。效果也是不明显的。我采用jconsole观察线程的使用情况

    3,使用AWS CLI进行快速验证

    AWS CLI采用python编写,具有较为完备的日志。
    安装指南:https://docs.amazonaws.cn/cli/latest/userguide/install-windows.html
    调整并发数量和配置日志:https://amazonaws-china.com/cn/blogs/china/amazon-s3-depth-of-practice-series-s3-cli-depth-parsing-and-performance-testing/
    批量生成不同大小的文件我采用了Bandizip(7zip只支持1MB以上的分卷大小):http://www.bandisoft.com/bandizip/
    并发请求数量和分片大小我设置为:
    s3 =
    max_concurrent_requests = 50
    multipart_threshold = 10MB
    multipart_chunksize = 6MB
    上传命令:
    aws s3 cp C:appqolfile s3://cu-ibas/oss/public --endpoint-url http://oss.ts-pfecs.epay --recursive
    命令参数说明如下:
    cp: 代表拷贝文件
    C:appqolfile:本地的目录
    s3://cu-ibas/oss/public:远端s3的地址,包含bucket名称和路径
    --endpoint-url http://oss.ts-pfecs.epay:指定远程端点地址
    --recursive :表示递归上传文件夹里面的文件

    上传并将日志存储在文件中:
    aws s3 cp C:appqolfile s3://cu-ibas/oss/public --endpoint-url http://oss.ts-pfecs.epay --recursive --debug >upload.txt 2>&1

    upload.txt的文件部分内容摘要
    2019-07-17 15:34:50,100 - ThreadPoolExecutor-1_2 - s3transfer.tasks - DEBUG - Executing task UploadSubmissionTask(transfer_id=2, {'transfer_future': <s3transfer.futures.transferfuture object="" at="" 0x0000026005c559e8="">}) with kwargs {'client': <botocore.client.s3 object="" at="" 0x0000026005b972b0="">, 'config': <s3transfer.manager.transferconfig object="" at="" 0x0000026005bf8e48="">, 'osutil': <s3transfer.utils.osutils object="" at="" 0x0000026005bf8eb8="">, 'request_executor': <s3transfer.futures.boundedexecutor object="" at="" 0x0000026005c43080="">, 'transfer_future': <s3transfer.futures.transferfuture object="" at="" 0x0000026005c559e8="">}
    2019-07-17 15:34:50,101 - ThreadPoolExecutor-1_3 - s3transfer.tasks - DEBUG - UploadSubmissionTask(transfer_id=3, {'transfer_future': <s3transfer.futures.transferfuture object="" at="" 0x0000026005c6b128="">}) about to wait for the following futures []
    2019-07-17 15:34:50,101 - ThreadPoolExecutor-1_3 - s3transfer.tasks - DEBUG - UploadSubmissionTask(transfer_id=3, {'transfer_future':
    ThreadPoolExecutor带有49,50等信息就代表并发请求数生效了。然后我做了不同文件大小的测试速度情况:

    分卷文件大小观察的上传速度
    1MB 1.5MB/s
    500KB 800KB/s
    10KB 390KB/s
    1KB 100KB/s

    这也就是说明了每个文件的大小对于文件上传速度是有影响的。如果每个文件的大小都大于1MB以上。在设置恰当的s3上传的带宽能够跑满。如果每个文件都小于1KB的情况下。上传速度会很慢的。

    4,总结

    先给出这个小文件数据集的情况下,没有办法提高上传速度。应用层可以采用边生成文件,边上传文件的模式来加快批量处理的速度。也就是采用生产者消费者模式。队列可以采用内存队列,可以采用redis的queue放置消费任务。

  • 相关阅读:
    sys.exc_info()方法:获取异常信息
    tempfile模块:生成临时文件和临时目录
    fnmatch模块:用于文件名的匹配
    pathlib模块用法详解
    linecache模块 随机读取文件指定行
    fileinput模块:逐行读取多个文件
    asyncio异步IO--协程(Coroutine)与任务(Task)详解
    Python中协程异步IO(asyncio)详解
    删除某个时间段之前的文件
    Mac入门--如何使用brew安装多个PHP版本
  • 原文地址:https://www.cnblogs.com/paxlyf/p/11201744.html
Copyright © 2011-2022 走看看