# COSBench (S3) 性能基准测试

## 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            | <p>driver1: 604.03 MB/S<br>driver2: 592.85 MB/S<br>driver3: 597.94 MB/S<br>driver4: 612.99 MB/S<br>total: 2407.81 MB/S</p>                                                                             |
| 1GB   | 10000 | 16           | <p>driver1: 5.45 GB/S<br>driver2: 5.1 GB/S<br>driver3: 4.69 GB/S<br>driver4: 5.2 GB/S<br>total: 20.44 GB/s</p>                                                                                         |
| 1GB   | 10000 | 128          | <p>driver1: 9.24 GB/S<br>driver2: 8.59 GB/S<br>driver3: 10.06 GB/S<br>driver4: 9.05 GB/S<br>total: 36.94 GB/s</p>                                                                                      |
| 100KB | 10000 | 1            | <p>driver1: 14.61 MB/S - 146.08 op/s<br>driver2: 11.96 MB/S - 119.55 op/s<br>driver3: 11.75 MB/S - 117.46 op/s<br>driver4: 11.94 MB/S - 119.42 op/s<br>total: 50.26 MB/S - 502.51 op/s</p>             |
| 100KB | 10000 | 16           | <p>driver1: 311.69 MB/S - 3116.87 op/s<br>driver2: 244.72 MB/S - 2447.15 op/s<br>driver3: 286.34 MB/S - 2863.35 op/s<br>driver4: 287.53 MB/S - 2875.26 op/s<br>total: 1130.28 MB/S - 11302.63 op/s</p> |
| 100KB | 10000 | 128          | <p>driver1: 1.19 GB/S - 11877.99 op/s<br>driver2: 1.17 GB/S - 11660.19 op/s<br>driver3: 1.16 GB/S - 11569.5 op/s<br>driver4: 1.17 GB/S - 11650.17 op/s<br>total: 4.69 GB/S - 46757.85 op/s</p>         |

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

* **COSBench 集群:** 1个 COSBench Controller 节点和 4个 COSBench Driver 节点
* **COSBench 实例:** [c5n.metal](https://aws.amazon.com/cn/ec2/instance-types/c5/): 72内核 + 192GB 内存 + 100Gb网络
* **Alluxio 集群:** 1个 Alluxio Coordinator 节点和4个 Alluxio Worker 节点。
* **Alluxio Worker 实例:** [i3en.metal](https://aws.amazon.com/cn/ec2/instance-types/i3en/): 96内核 + 768GB 内存 + 100Gb网络 + 8 nvme固态硬盘
* **AWS ELB 负载均衡器:** [Elastic Load Balancing](https://aws.amazon.com/cn/elasticloadbalancing/getting-started/)

## 准备测试环境

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

### 配置Alluxio

有关其他 Alluxio 相关配置，请参阅 [Fio Tests](https://documentation.alluxio.io/ee-ai-cn/ai-3.6/benchmark/fio) 部分。

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

### 准备 COSBench工具

1. 从 COSBench GitHub 网站 下载 [COSBench 0.4.2.c4.zip 压缩包](https://github.com/intel-cloud/cosbench/releases/tag/v0.4.2.c4)，并在服务器上进行解压。
2. 安装 COSBench 的依赖库，执行如下命令。

* 对于 centos 系统，执行如下命令安装依赖：

  ```bash
  sudo yum install nmap-ncat curl java-1.8.0-openjdk-devel -y
  ```

3. 编辑 `cosbench-start.sh` 文件，在 Java 启动行添加如下参数，关闭 s3 的 md5 校验功能：

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

<figure><img src="https://3373003307-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwnevsZwPNckCUenYadxu%2Fuploads%2Fgit-blob-4a99e54e8ebf0998ec2425a3e574f41f4cdfeabd%2Fdisable-md5-validation.png?alt=media" alt=""><figcaption></figcaption></figure>

4. 启动COSBench controller 和 driver：

* 对于 centos 系统，执行以下命令：

  ```bash
  sudo bash start-all.sh
  ```

### 运行测试

1. 编辑 s3-config-sample.xml 文件并添加任务配置信息，任务配置主要包含如下五个阶段：

   1. init 阶段：根据参数配置的桶名的前缀、后缀和Container数目，创建存储桶。
   2. prepare 阶段：为桶写入后续读取的数据，根据配置指定线程数，上传对应大小和数目的对象。
   3. main 阶段：进行测试的主要阶段，可以指定运行的时长，指定线程数执行对应的读写操作。
   4. cleanup 阶段：这个阶段是进行环境的清理，主要是删除桶中的数据，保证测试后的数据不会保留在集群中
   5. dispose 阶段：删除存储桶。

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

   > 注意: 使用使用 [挂载表操作](https://documentation.alluxio.io/ee-ai-cn/ai-3.6/overview/namespace#挂载表操作)时， 无法创建新桶，你应该跳过 init 阶段和 dispose 阶段，并手动创建满足桶名前缀和container命名规则的挂载点进行后续测试。

   参数说明：

   | 参数                  | 描述                                                                                                                                    |
   | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
   | accesskey、secretkey | <p>目前 Alluxio S3 API 不支持access key和secret key。<br>当向 S3 client 提供access key时，请输入要使用的 Alluxio ACL 用户名。 secret key未使用，因此您可以使用任何虚拟值。</p> |
   | 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
   <?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
   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
   <?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的性能压测，结果如下：

   <figure><img src="https://3373003307-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwnevsZwPNckCUenYadxu%2Fuploads%2Fgit-blob-ab193215e05d3ce46ca26f53f38ca49dbdb78384%2Fcosbench-result.png?alt=media" alt=""><figcaption></figcaption></figure>
5. 执行以下命令，停止测试服务

   ```bash
   sudo bash stop-all.sh
   ```
