# COSBench 性能基准测试

## 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](/ee-ai-cn/ai-3.4/performance/fio-tests.md) 部分。

* 可将一个或多个 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="/files/Ek5qCtYXgCQGAsC90N70" 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.4/performance/pages/oDewb6KbLdrwss4HRo4S#挂载表操作)时， 无法创建新桶，你应该跳过 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="/files/9SveRSzGUJKw6sB0jSHB" alt=""><figcaption></figcaption></figure>
5. 执行以下命令，停止测试服务

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.alluxio.io/ee-ai-cn/ai-3.4/performance/cosbench-performance-benchmark.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
