cosbench - 对象存储性能压力测试工具
Posted YoungerChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cosbench - 对象存储性能压力测试工具相关的知识,希望对你有一定的参考价值。
《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于dd、fio、vdbench、iozone、iometer、cosbench等性能负载工具,及strace等调试工具。
1 概述
COSBench 是一个用于测试对象存储系统的分布式基准测试工具,也允许用户为额外的存储系统创建适配器。
由两个主要组件组成Driver和Controller。
- Driver(Load Generator):
负责生成工作负载,向目标对象存储发出操作;性能统计
可通过http://:18088/driver/index.html访问
- Controller:
负责协调drivers集体执行工作,收集和汇总聚合来自driver实例的运行时状态或基准测试结果。
两个组件可以混合部署在一个节点上,也可以分开来部署.
COSBench 现支持:
OpenStack* Swift
Amazon* S3
Amplidata v2.3,2.5 和 3.1
Scality*
Ceph
CDMI
Google* Cloud Storage
自定义适配器
2 安装
2.1 安装依赖包
1、java: 需要java1.6 版本及以上
2、nc(nmap-ncat): 用来检测服务端口
[root@ceph-node1 ~]# yum install java nc
[root@ceph-node1 ~]# java -version #测试java是否可用
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
2.2 安装cosbench
下载解压并查看
[root@ceph-node1 ~]# wget https://github.com/intel-cloud/cosbench/releases/download/v0.4.2.c4/0.4.2.c4.zip
[root@ceph-node1 ~]# unzip 0.4.2.c4.zip
官方英文使用文档(超详细,可以翻翻看)
[root@ceph-node1 0.4.2.c4]# ll *.pdf
-rw-r--r--. 1 root root 348912 Jul 9 2014 3rd-party-licenses.pdf
-rw-r--r--. 1 root root 985318 Jul 9 2014 COSBenchAdaptorDevGuide.pdf
-rw-r--r--. 1 root root 2516640 Apr 27 2016 COSBenchUserGuide.pdf
服务调用脚本说明
[root@ceph-node1 0.4.2.c4]# ll *.sh
-rw-r--r--. 1 root root 2639 Oct 30 00:25 cli.sh #通过命令行操作cosbench
-rw-r--r--. 1 root root 2944 Apr 27 2016 cosbench-start.sh #其他启动脚本调用的脚本
-rw-r--r--. 1 root root 1423 Dec 30 2014 cosbench-stop.sh #其他启动脚本调用的脚本
-rw-r--r--. 1 root root 727 Apr 27 2016 start-all.sh #在当前节点启动driver和controller组件
-rw-r--r--. 1 root root 724 Apr 27 2016 stop-all.sh #在当前节点停止driver和controller组件
-rw-r--r--. 1 root root 1062 Jul 9 2014 start-controller.sh #在当前节点启动controller
-rw-r--r--. 1 root root 1912 Oct 30 00:22 start-driver.sh #在当前节点启动driver
-rw-r--r--. 1 root root 809 Jul 9 2014 stop-controller.sh #在当前节点关闭controller
-rw-r--r--. 1 root root 1490 Apr 27 2016 stop-driver.sh #在当前节点关闭driver
2.3 Cosbench简单验证
一、修改driver配置(如果是本地访问可忽略)
默认driver配置的页面地址为127.0.0.1,要修改为当前服务器IP,用以其他节点访问。
[root@ceph-node1 0.4.2.c4]# cat /root/0.4.2.c4/start-driver.sh
#!/bin/bash
ip=192.168.1.51 #默认为127.0.0.1,将之修改为部署节点的IP,供其他节点访问
num=1
base_port=18088
……
二、启动cosbench
启动前为了保证driver和controller之间交互正常,需要关闭HTTP代理
[root@ceph-node1 0.4.2.c4]# unset http_proxy
启动controller和driver
[root@ceph-node1 0.4.2.c4]# sh start-all.sh
Launching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
.
Starting cosbench-log_0.4.2 [OK]
.
Starting cosbench-tomcat_0.4.2 [OK]
Starting cosbench-config_0.4.2 [OK]
Starting cosbench-http_0.4.2 [OK]
Starting cosbench-cdmi-util_0.4.2 [OK]
Starting cosbench-core_0.4.2 [OK]
Starting cosbench-core-web_0.4.2 [OK]
Starting cosbench-api_0.4.2 [OK]
Starting cosbench-mock_0.4.2 [OK]
Starting cosbench-ampli_0.4.2 [OK]
Starting cosbench-swift_0.4.2 [OK]
Starting cosbench-keystone_0.4.2 [OK]
Starting cosbench-httpauth_0.4.2 [OK]
Starting cosbench-s3_0.4.2 [OK]
Starting cosbench-librados_0.4.2 [OK]
Starting cosbench-scality_0.4.2 [OK]
Starting cosbench-cdmi-swift_0.4.2 [OK]
Starting cosbench-cdmi-base_0.4.2 [OK]
Starting cosbench-driver_0.4.2 [OK]
Starting cosbench-driver-web_0.4.2 [OK]
Successfully started cosbench driver!
Listening on port 0.0.0.0/0.0.0.0:18089 ...
Persistence bundle starting...
Persistence bundle started.
----------------------------------------------
!!! Service will listen on web port: 18088 !!!
----------------------------------------------
======================================================
Launching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench controller ...
.
Starting cosbench-log_0.4.2 [OK]
.
Starting cosbench-tomcat_0.4.2 [OK]
Starting cosbench-config_0.4.2 [OK]
Starting cosbench-core_0.4.2 [OK]
Starting cosbench-core-web_0.4.2 [OK]
Starting cosbench-controller_0.4.2 [OK]
Starting cosbench-controller-web_0.4.2 [OK]
Successfully started cosbench controller!
Listening on port 0.0.0.0/0.0.0.0:19089 ...
Persistence bundle starting...
Persistence bundle started.
----------------------------------------------
!!! Service will listen on web port: 19088 !!!
----------------------------------------------
三、验证
查看java进程和端口
[root@ceph-node1 0.4.2.c4]# netstat -nplt |grep 18088
tcp6 0 0 :::18088 :::* LISTEN 6084/java
[root@ceph-node1 0.4.2.c4]# netstat -nplt |grep 19088
tcp6 0 0 :::19088 :::* LISTEN 6235/java
[root@ceph-node1 0.4.2.c4]# ps aux |grep java
root 6084 5.3 4.4 3562620 178000 pts/1 Sl 02:26 0:10 java -Dcosbench.tomcat.config=conf/driver-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.driver -console 18089
root 6235 5.2 3.8 3555108 153032 pts/1 Sl 02:26 0:10 java -Dcosbench.tomcat.config=conf/controller-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.controller -console 19089
root 6327 0.0 0.0 112812 980 pts/1 S+ 02:29 0:00 grep --color=auto java
使用cli.sh查看启动信息
[root@ceph-node1 0.4.2.c4]# sh cli.sh info
Drivers:
driver1 http://127.0.0.1:18088/driver
Total: 1 drivers
Active Workloads:
Total: 0 active workloads
由上信息得知,controller和driver都已启动,访问http://<IP>:19088/controller/index.html验证。
2.4 常见问题
如果不安装nc,会报错
which: no nc in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
No appropriate tool found to detect cosbench driver status.
如果不安装java,会报
Ncat: Connection refused.
3 配置文件说明
进入conf目录下,查看s3-config-sample.xml配置文件内容如下:
[root@k8s-01 conf]# cat s3-config-sample.xml
<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3-sample" description="sample benchmark for s3">
<storage type="s3" config="accesskey=<accesskey>;secretkey=<scretkey>;proxyhost=<proxyhost>;proxyport=<proxyport>;endpoint=<endpoint>" />
<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>
下面对配置文件的参数进行说明:
workload name : 测试时显示的任务名称,这里可以自行定义
description : 描述信息,这里可以自己定义
storage type: 存储类型,这里配置为s3即可
config : 对该类型的配置,
workstage name : cosbench是分阶段按顺序执行,此处为init初始化阶段,主要是进行bucket的创建,workers表示执行该阶段的时候开启多少个工作线程,创建bucket通过不会计算为性能,所以单线程也可以;config处配置的是存储桶bucket的名称前缀;containers表示轮询数,上例中将会创建以s3testqwer为前缀,后缀分别为1和2的bucket
prepare阶段 : 配置为bucket写入的数据,workers和config以及containers与init阶段相同,除此之外还需要配置objects,表示一轮写入多少个对象,以及object的大小。
main阶段 : 这里是进行测试的阶段,runtime表示运行的时间,时间默认为秒
operation type : 操作类型,可以是read、write、delete等。ratio表示该操作所占有操作的比例,例如上面的例子中测试读写,read的比例为80%,write的比例为20%; config中配置bucket的前缀后缀信息。注意write的sizes可以根据实际测试进行修改
cleanup阶段 : 这个阶段是进行环境的清理,主要是删除bucket中的数据,保证测试后的数据不会保留在集群中
dispose阶段 : 这个阶段是删除bucket
4 测试案例配置
cosbench工具使用按照流程可分为以下几个步骤:参数配置--服务启动--提交测试--分析结果
示例使用三个节点联机测试,配置示意如下:
节点主机名 | 节点IP地址 | cosbench角色 |
node241 | 66.66.66.241 | controller、driver |
node242 | 66.66.66.242 | driver |
node243 | 66.66.66.243 | driver |
4.1 参数配置
controller和driver依赖不同系统配置来启动服务,在启动controller和driver服务时,需要先行定义角色配置
一、controller配置
controller在初始化时读取conf/controller.conf配置文件启动控制器服务
[root@node241 0.4.2.c4]# cat conf/controller.conf
[controller]
concurrency=1
drivers=3
log_level=INFO
log_file=log/system.log
archive_dir=archive
[driver1]
name=driver1
url=http://66.66.66.241:18088/driver
[driver2]
name=driver2
url=http://66.66.66.242:18088/driver
[driver3]
name=driver3
url=http://66.66.66.243:18088/driver
[controller]
- concurrency:默认值为1,表示可以同时执行的工作负载数量
- drivers:默认值为1,表示此controller控制的driver数量
- log_level:默认值为INFO,可选值为TRACE、DEBUG、INFO、WARN、ERROR,表示日志打印等级
- log_file:默认值为log/system.log,表示日志文件存放位置
- archive_dir:默认值为archive,表示工作负载结果存放位置,当参数值为archive,则工作负载结果存放于0.4.2/archive目录内
[driver#x]
当有多个driver时,第n个driver命名为[drivern]
- name:用于标识driver节点的标签,名称可以自定义
- url:访问driver节点的地址
二、driver配置
driver在初始化时读取conf/driver.conf配置文件启动负载器服务。
[root@node241 0.4.2.c4]# cat conf/driver.conf
[driver]
name=127.0.0.1:18088
url=http://127.0.0.1:18088/driver
[driver]
- name:用于标识driver节点的标签,名称可以自定义
- url:访问driver节点的地址
4.2 服务启动
一、controller启动
在controller角色节点执行以下命令启动controller
[root@node241 0.4.2.c4]# sh start-controller.sh
#检查controller服务启动情况
[root@node241 0.4.2.c4]# lsof -i:19088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 30012 root 88u IPv6 184509 0t0 TCP *:19088 (LISTEN)
[root@node241 0.4.2.c4]# ps -aux | grep 30012
root 30012 0.6 4.2 4585852 165528 pts/0 Sl 15:51 0:06 java -Dcosbench.tomcat.config=conf/controller-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.controller -console 19089
注:若节点需要同时启动controller和driver角色,也可以使用sh start-all.sh命令启动(start-all.sh=start-driver.sh+start-controller.sh)
二、driver启动
在所有driver角色节点执行以下命令启动driver
[root@node242 0.4.2.c4]# sh start-driver.sh
#检查driver服务启动情况
[root@node242 0.4.2.c4]# lsof -i:18088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23102 root 100u IPv6 161668 0t0 TCP *:18088 (LISTEN)
[root@node242 0.4.2.c4]# ps -aux | grep 23102
root 23102 0.2 5.2 4597000 203344 pts/0 Sl 15:12 0:07 java -Dcosbench.tomcat.config=conf/driver-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.driver -console 18089
4.3 提交测试
可以使用以下两种方法提交测试(示例测试参数文件为config.xml)
一、使用命令行接口
在controller节点cosbench目录下,使用sh cli.sh submit test.xml命令提交测试
[root@node241 0.4.2.c4]# sh cli.sh submit conf/config.xml
二、使用web控制台
web访问控制台地址http://controller-ip:19088/controller,点击submit new workloadsurl,提交测试文件即可
4.4 分析结果
一、使用命令行接口
在controller节点cosbench目录下,使用sh cli.sh info命令查看当前运行任务
二、使用web控制台
web访问控制台地址http://controller-ip:19088/controller,点击对应任务view detailsurl,查看当前运行状态及结果
5 选择表达式
5.1 概述
在测试参数文件中,auth、storage、storage、work定义中支持config属性配置,该属性包含一个可选的参数列表(使用键值对格式表示,如"a=a_val;b=b_val")
在参数列表中,常用的键包括containers、objects、sizes,用来指定如何选择容器、对象、大小.
5.2 选择器
表达式 | 格式 | 注释 |
constant | c(number) | 仅使用指定数字 |
一般在常用于对象大小定义,如sizes=c(512)KB,则表示对象大小为512KB | ||
uniform | u(min, max) | 从(min,max)中均匀选择 |
u(1,100)表示从1到100中均匀地选取一个数字,选择是随机的,有些数字可能被选中多次,有些数字永远不会被选中 | ||
range | r(min,max) | 从(min,max)递增选择 |
r(1,100)表示从1到100递增地选取一个数字(每个数字只被选中一次),这通常被用于特殊work(init、prepare、cleanup、dispose) | ||
sequential | s(min,max) | 从(min,max)递增选择 |
s(1,100)表示从1到100递增地选取一个数字(每个数字只被选中一次),这通常被用于常规work | ||
histogram | h(min1|max1|weight1,…) | 它提供了一个加权直方图生成器,要配置它,需要指定一个逗号分隔的桶列表,其中每个桶由一个范围和一个整数权重定义。例如: h(1|64|10,64|512|20,512|2048|30)KB 其中定义了一个配置文件,其中(1,64)KB被加权为10,(64,512)KB被加权为20,(512,2048)KB被加权为30.权重之和不一定是100 |
5.3 参数组合
基于元素类型和工作类型的选择器有额外的约束,下面两个表列出了允许的组合
- 元素类型选择器
Key | constant (c(num)) | uniform (u(min,max)) | range (r(min,max)) | sequential (s(min,max)) | Histogram (h(min|max|ratio)) |
containers | ✔ | ✔ | ✔ | ✔ | |
objects | ✔ | ✔ | ✔ | ✔ | |
sizes | ✔ | ✔ | ✔ | ✔ |
- 工作类型选择器
Key | init | prepare | normal (read) | normal (write) | normal (delete) | cleanup | dispose |
containers | r(), s() | r(), s() | c(), u(), r(), s() | c(), u(), r(), s() | c(), u(), r(), s() | r(), s() | r(), s() |
objects | r(), s() | c(), u(), r(), s() | c(), u(), r() | c(), u(), r(), s() | r(), s() | ||
sizes | c(), u(), h() | c(), u(), h() |
6 负载配置详解
本小节主要介绍工作负载参数定义,通常为标签对目录结构的xml文件,目录结构示意如下:
<workload>
<auth /> #可选项
<storage />
<workflow>
<workstage>
<auth /> #可选项
<storage /> #可选项
<work />
<auth /> #可选项
<storage /> #可选项
<operation />
</workstage>
</workflow>
</workload>
相关说明:
- 参数定义可分为多个级别,具体流程为workload-workstage-work-operation
- 身份验证定义(auth)和存储定义(storage)可以在多个级别中定义
- 通常只在workload工作负载级别定义即可
- 当在多个级别定义,低级别定义优先于高级别定义,如在workload和work两个级别分别定义不同的auth和storage,最终以最低级别(work)定义为准
- 一个workload可以定义一个或多个workstage(多个测试项时指定多个workstage),一个workstage可以定义一个或多个work(多个客户端测试时指定多个work),一个work可以定义一个或多个operation(混合读写操作时指定多个operation)
- 多个workstage执行顺序是串行的,当执行完一个之后才会执行下一个
- 多个work执行顺序是并行的,当执行到具体workstage时,其定义的多个work同时执行
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3-sample" description="sample benchmark for s3">
<storage type="s3" config="accesskey=<accesskey>;secretkey=<scretkey>;proxyhost=<proxyhost>;proxyport=<proxyport>;endpoint=<endpoint>" />
<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>
6.1 workload定义(工作负载)
<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3-sample" description="sample benchmark for s3">
</workload>
- name:工作负载名称定义
- description:工作负载一些相关描述
6.2 auth定义(认证机制)
cosbench认证机制有none、mock、swauth、keystone、httpauth
- none (do nothing, default):默认值,不进行任何操作
<auth type="none" config="" />
config参数列表如下:
参数 | 类型 | 默认值 | 注释 |
logging | 布尔型 | false | 将信息打印到日志 |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
Caching | 布尔型 | false | 是否缓存认证信息 |
type | 字符串 | “cdmi” | 选项:“cdmi”或“non-cdmi”,它表示要使用的内容类型,“cdmi”表示存储访问将遵循cdmi内容类型,“non-cdmi”表示存储访问将遵循非cdmi内容类型. |
Customer_headers | 字符串 | 这是一个实验参数,用于查看是否可能支持cdmi衍生物,这可能需要额外的标头。 可以在不通知的情况下移除该参数。 |
- mock (delay specified time):延迟指定时间
<auth type="mock" config="" />
config参数列表如下:
参数 | 类型 | 默认值 | 注释 |
token | 字符串 | “token” | Token字符串 |
delay | 长整型 | 20 | 延迟时间(以毫秒为单位) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
- swauth (for OpenStack Swift):适用于OpenStack Swift
<auth type="swauth" config="username=username;password=password;url=http://controller-ip:8080/auth/v1.0 />"
config参数列表如下:
参数 | 类型 | 默认值 | 注释 |
url | 字符串 | http:/controller-ip:8080/auth/v1.0 | auth节点的URL,一般为controller节点 |
username | 字符串 | 用于认证的用户名,语法account:user | |
password | 字符串 | 用于认证的密码 | |
timeout | 整型 | 30,000 | 连接超时值(以毫秒为单位) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
- keystone (for OpenStack Swift):适用于OpenStack Swift
<auth type="keystone" config="username=username;password=password;tenant_name=tenant_name;url=http://controller-ip:8080/v2.0;service=swift"/>
config参数列表如下:
参数 | 类型 | 默认值 | 注释 |
url | 字符串 | http://controller-ip:8080/auth/v2.0 | auth节点的URL |
username | 字符串 | 用于认证的用户名。 语法account:user | |
password | 字符串 | 用于认证的密码 | |
tenant_name | 字符串 | 用户所属的租户名称 | |
service | 字符串 | swift | 请求的服务 |
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
- httpauth (Http BASIC/DIGEST)
参数 | 类型 | 默认值 | 注释 |
auth_url | 字符串 | http://controller-ip:8080/ | auth节点的URL |
username | 字符串 | 用于认证的用户名。 | |
password | 字符串 | 用于认证的密码 | |
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
6.3 storage定义(存储系统)
- none (do nothing, default):默认值,不进行任何操作
<storage type="none" config="" />
config参数列表如下:
参数 | 类型 | 默认值 | 注释 |
logging | 布尔型 | false | 将信息打印到日志 |
- delay specified time
<storage type="mock" config="" />
config参数列表如下:
参数 以上是关于cosbench - 对象存储性能压力测试工具的主要内容,如果未能解决你的问题,请参考以下文章 |