cosbench - 对象存储性能压力测试工具

Posted YoungerChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cosbench - 对象存储性能压力测试工具相关的知识,希望对你有一定的参考价值。

        《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于ddfiovdbenchiozoneiometercosbench等性能负载工具,及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

controllerdriver

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)

从(minmax)中均匀选择 

u(1,100)表示从1100中均匀地选取一个数字,选择是随机的,有些数字可能被选中多次,有些数字永远不会被选中

range

r(min,max)

从(minmax)递增选择 

r(1,100)表示从1100递增地选取一个数字(每个数字只被选中一次),这通常被用于特殊workinitpreparecleanupdispose

sequential

s(min,max)

从(minmax)递增选择 

s(1,100)表示从1100递增地选取一个数字(每个数字只被选中一次),这通常被用于常规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 - 对象存储性能压力测试工具的主要内容,如果未能解决你的问题,请参考以下文章

cosbench - 对象存储性能压力测试工具

使用COSBench工具对ceph s3接口进行压力测试

玩转ceph性能测试---对象存储

vdbench - 性能压力测试工具

vdbench - 性能压力测试工具

iozone - 性能压力测试工具

(c)2006-2024 SYSTEM All Rights Reserved IT常识