Cosbench 性能基准测试

Slack Docker Pulls

COSBench 概览

COSBench 是一款由 Intel 开源,用于对象存储的压测工具。

Alluxio 支持与 Amazon[S3 API (http://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)] 基本操作兼容的 RESTful API,可使用该工具进行读写性能压测。

本文档介绍如何通过COSBench来对Alluxio进行端到端测试。

测试结果摘要

文件大小 文件数量 每个driver的并发数 吞吐量
1GB 10000 1 driver1: 604.03 MB/S
driver2: 592.85 MB/S
driver3: 597.94 MB/S
driver4: 612.99 MB/S
total: 2407.81 MB/S
1GB 10000 16 driver1: 5.45 GB/S
driver2: 5.1 GB/S
driver3: 4.69 GB/S
driver4: 5.2 GB/S
total: 20.44 GB/s
1GB 10000 128 driver1: 9.24 GB/S
driver2: 8.59 GB/S
driver3: 10.06 GB/S
driver4: 9.05 GB/S
total: 36.94 GB/s
100KB 10000 1 driver1: 14.61 MB/S - 146.08 op/s
driver2: 11.96 MB/S - 119.55 op/s
driver3: 11.75 MB/S - 117.46 op/s
driver4: 11.94 MB/S - 119.42 op/s
total: 50.26 MB/S - 502.51 op/s
100KB 10000 16 driver1: 311.69 MB/S - 3116.87 op/s
driver2: 244.72 MB/S - 2447.15 op/s
driver3: 286.34 MB/S - 2863.35 op/s
driver4: 287.53 MB/S - 2875.26 op/s
total: 1130.28 MB/S - 11302.63 op/s
100KB 10000 128 driver1: 1.19 GB/S - 11877.99 op/s
driver2: 1.17 GB/S - 11660.19 op/s
driver3: 1.16 GB/S - 11569.5 op/s
driver4: 1.17 GB/S - 11650.17 op/s
total: 4.69 GB/S - 46757.85 op/s

测试结果基于如下配置的 Alluxio 集群,所有服务器实例均在 AWS 上可用:

  • COSBench 集群: 1个 COSBench Controller 节点和 4个 COSBench Driver 节点

  • COSBench 实例: c5n.metal: 72内核 + 192GB 内存 + 100Gb网络

  • Alluxio 集群: 1个 Alluxio Coordinator 节点和4个 Alluxio Worker 节点。

  • Alluxio Worker 实例: i3en.metal: 96内核 + 768GB 内存 + 100Gb网络 + 8 nvme固态硬盘

  • AWS ELB 负载均衡器: Elastic Load Balancing

准备测试环境

工具推荐运行在 CentOS 7.0 及其以上版本,ubuntu 环境可能存在预期外的问题。

配置Alluxio

有关其他 Alluxio 相关配置,请参阅 Fio Tests 部分。

  • 可将一个或多个 Alluxio Worker 配置为缓存集群。
  • 需要配置一个负载均衡器将请求均匀发往所有的 Alluxio Worker 节点
  • 确保数据集已从 UFS 完全加载到 Alluxio 缓存中。

准备 COSBench工具

  1. 从 COSBench GitHub 网站 下载 COSBench 0.4.2.c4.zip 压缩包,并在服务器上进行解压。
  2. 安装 COSBench 的依赖库,执行如下命令。
    • 对于 centos 系统,执行如下命令安装依赖:
      sudo yum install nmap-ncat curl java-1.8.0-openjdk-devel -y
      
  3. 编辑 cosbench-start.sh 文件,在 Java 启动行添加如下参数,关闭 s3 的 md5 校验功能:

    -Dcom.amazonaws.services.s3.disableGetObjectMD5Validation=true
    

    Disable md5 validation

  4. 启动COSBench controller 和 driver:
    • 对于 centos 系统,执行以下命令:
      sudo bash start-all.sh
      

运行测试

  1. 编辑 s3-config-sample.xml 文件并添加任务配置信息,任务配置主要包含如下五个阶段:
    1. init 阶段:根据参数配置的桶名的前缀、后缀和Container数目,创建存储桶。
    2. prepare 阶段:为桶写入后续读取的数据,根据配置指定线程数,上传对应大小和数目的对象。
    3. main 阶段:进行测试的主要阶段,可以指定运行的时长,指定线程数执行对应的读写操作。
    4. cleanup 阶段:这个阶段是进行环境的清理,主要是删除桶中的数据,保证测试后的数据不会保留在集群中
    5. dispose 阶段:删除存储桶。

    在测试过程中,可以根据实际需要,执行所有的阶段或者只执行其中部分阶段。

    注意: 使用使用 挂载表操作时, 无法创建新桶,你应该跳过 init 阶段和 dispose 阶段,并手动创建满足桶名前缀和container命名规则的挂载点进行后续测试。

    参数说明:

    参数 描述
    accesskey、secretkey 目前 Alluxio S3 API 不支持access key和secret key。
    当向 S3 client 提供access key时,请输入要使用的 Alluxio ACL 用户名。 secret key未使用,因此您可以使用任何虚拟值。
    cprefix 存储桶名称前缀,例如 examplebucket
    containers 为存储桶名称数值区间,最后的存储桶名称由 cprefix 和 containers 和 csuffix(如果设置了该参数) 组成, 例如:examplebucket1test,examplebucket2test
    csuffix 可选,存储桶名称后缀,例如 test
    oprefix 对象名称前缀,例如 "testobject", "dir/testobject"
    objects 当前任务的对象数目和命名范围,例如 "r(1,10000)", "r(200,500)"
    osuffix 对象名称后缀,例如 ".jpg", ".csv"
    radio 当前任务的读写比例
    runtime 压测运行时间
    workers 当前任务的线程数

    示例配置如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <workload name="s3-sample" description="sample benchmark for s3">
      <storage type="s3" config="accesskey=root;secretkey=dump;endpoint=http://localhost:29998;path_style_access=true" />
    
      <workflow>
        <workstage name="init">
          <work type="init" workers="1" config="cprefix=s3testqwer;containers=r(1,2)" />
        </workstage>
    
        <workstage name="prepare">
          <work type="prepare" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,10);sizes=c(64)KB" />
        </workstage>
    
        <workstage name="main">
          <work name="main" workers="8" runtime="30">
            <operation type="read" ratio="80" config="cprefix=s3testqwer;containers=u(1,2);objects=u(1,10)" />
            <operation type="write" ratio="20" config="cprefix=s3testqwer;containers=u(1,2);objects=u(11,20);sizes=c(64)KB" />
          </work>
        </workstage>
    
        <workstage name="cleanup">
          <work type="cleanup" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,20)" />
        </workstage>
    
        <workstage name="dispose">
          <work type="dispose" workers="1" config="cprefix=s3testqwer;containers=r(1,2)" />
        </workstage>
      </workflow>
    </workload>
    
  2. 运行任务:
    bash cli.sh submit conf/s3-config-sample.xml
    
  3. 检查任务结果

    通过网址 http://ip:19088/controller/index.html(ip 替换为使用的压测机器 IP)查看执行状态:

  4. 下面展示的是10万个100KB文件高并发读取的读性能测试,包括以下2个阶段:
    1. prepare 阶段:100个 worker 线程,上传 10000 个 100KB 对象。
    2. main 阶段:4个 Driver,每个Driver 128个 worker 线程并发读对象,运行300秒。
    <?xml version="1.0" encoding="UTF-8" ?>
    <workload name="s3-sample" description="sample benchmark for s3">
      <storage type="s3" config="accesskey=root;secretkey=dump;endpoint=http://<ip>:29998;path_style_access=true" />
      <workflow>
        <workstage name="prepare">
          <work type="prepare" workers="100" config="cprefix=ufs;containers=r(2,2);oprefix=myobjects;osuffix=.jpg;objects=r(1,10000);sizes=c(100)KB" />
        </workstage>
    
        <workstage name="128">
          <work name="read" workers="128" driver="driver1" runtime="300">
            <operation type="read" ratio="100" config="cprefix=ufs;containers=r(2,2);oprefix=myobjects;osuffix=.jpg;objects=u(1,10000)" />
          </work>
          <work name="read" workers="128" driver="driver2" runtime="300">
            <operation type="read" ratio="100" config="cprefix=ufs;containers=r(2,2);oprefix=myobjects;osuffix=.jpg;objects=u(1,10000)" />
          </work>
          <work name="read" workers="128" driver="driver3" runtime="300">
            <operation type="read" ratio="100" config="cprefix=ufs;containers=r(2,2);oprefix=myobjects;osuffix=.jpg;objects=u(1,10000)" />
          </work>
          <work name="read" workers="128" driver="driver4" runtime="300">
            <operation type="read" ratio="100" config="cprefix=ufs;containers=r(2,2);oprefix=myobjects;osuffix=.jpg;objects=u(1,10000)" />
          </work>
        </workstage>
      </workflow>
    </workload>
    

    经过以上阶段1和阶段2的性能压测,结果如下:

    COSBench result

  5. 执行以下命令,停止测试服务
    sudo bash stop-all.sh