参考资料:
https://blog.csdn.net/QTM_Gitee/article/details/100067724
https://github.com/intel-cloud/cosbench/blob/master/COSBenchUserGuide.pdf
COSBench测Ceph对象存储:那些网上找不到的细节html
cosbench - Cloud Object Storage Beachmark,是Intel开发的一个对象存储基准性能测试工具,支持OpenStack* Swift
, Amazon* S3
, Amplidata v2.3, 2.5 and 3.1
, Scality*
, Ceph
, CDMI
, Google* Cloud Storage
, Aliyun OSS
对象存储java
cosbench能够联机测试,主要有如下两个关键组件:node
driver
cosbench负载生成器,主要负责工做负载生成,发布针对云对象存储的操做和收集性能统计信息
能够经过http://{driver-ip}:18088/driver
地址访问linux
controller
cosbench控制器,主要负责协调负载生成器共同执行工做负载,收集来自负载生成器的基准性能测试结果
能够经过http://{controller-ip}:19088/controller
地址访问
注:controller和driver角色能够部署在同一个节点上git
下载jre版本包,解压缩至/opt
目录下github
wget https://javadl.oracle.com/webapps/download/AutoDL?BundleId=242050_3d5a2bb8f8d4428bbe94aed7ec7ae784 -O jre-8u251-linux-x64.tar.gz tar -zxvf jre-8u251-linux-x64.tar.gz -C /opt/
配置jre环境变量web
echo "export JAVA_HOME=/opt/jre1.8.0_251/" >> /etc/profile echo "export CLASSPATH=/opt/jre1.8.0_251/lib" >> /etc/profile echo "export PATH=/opt/jre1.8.0_251/bin:$PATH" >> /etc/profile source /etc/profile
controller和driver之间通讯须要依赖nc环境算法
执行 yum install -y nmap-ncat
命令在线安装ncat包swift
一般状况下,系统默认已经安装curl包
如系统未安装,可经过yum install curl -y
命令在线安装后端
官方提供的最新版本
v0.4.2
存在没法启动问题MESSAGE Bundle plugins/cosbench-log4j not found.
,具体详见Github-Issues#383
为规避此问题,此处选择的是v0.4.2.c4
版本
wget https://github.com/intel-cloud/cosbench/releases/download/v0.4.2.c4/0.4.2.c4.zip unzip 0.4.2.c4.zip
使用过程当中须要关闭防火墙
或者开放指定端口
,经过如下任意一种方法都可以
关闭防火墙
执行systemctl stop firewalld
命令便可
开放指定端口
driver角色须要使用到18089
及18088
端口
controller角色须要使用到19089
及19088
端口
#开放driver角色服务端口 firewall-cmd --zone=public --add-port=18088/tcp --permanent firewall-cmd --zone=public --add-port=18089/tcp --permanent systemctl reload firewalld #开放controller角色服务端口 firewall-cmd --zone=public --add-port=19088/tcp --permanent firewall-cmd --zone=public --add-port=19089/tcp --permanent systemctl reload firewalld
参考Github-Issues#320,基于0.4.2.c4版本,读文件测试过程当中会出现没法验证下载文件完整性错误(Unable to verify integrity of data download),致使读取测试任务中断(Terminate),故此处关闭S3的MD5校验功能
修改全部节点0.4.2.c4/cosbench-start.sh
配置文件,在java后添加参数-Dcom.amazonaws.services.s3.disableGetObjectMD5Validation=true
[root@node241 0.4.2.c4]# cat cosbench-start.sh | grep java /usr/bin/nohup java -Dcom.amazonaws.services.s3.disableGetObjectMD5Validation=true -Dcosbench.tomcat.config=$TOMCAT_CONFIG -server -cp main/* org.eclipse.equinox.launcher.Main -configuration $OSGI_CONFIG -console $OSGI_CONSOLE_PORT 1> $BOOT_LOG 2>&1 &
cosbench工具使用按照流程可分为如下几个步骤:参数配置--服务启动--提交测试--分析结果
示例使用三个节点联机测试,配置示意以下:
节点主机名 | 节点IP地址 | cosbench角色 |
---|---|---|
node241 | 66.66.66.241 | controller、driver |
node242 | 66.66.66.242 | driver |
node243 | 66.66.66.243 | driver |
controller和driver依赖不一样系统配置来启动服务,在启动controller和driver服务时,须要先行定义角色配置
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]
1
,表示能够同时执行的工做负载数量1
,表示此controller
控制的driver
数量INFO
,可选值为TRACE
、DEBUG
、INFO
、WARN
、ERROR
,表示日志打印等级log/system.log
,表示日志文件存放位置archive
,表示工做负载结果存放位置,当参数值为archive
,则工做负载结果存放于0.4.2/archive
目录内[driverx]
当有多个driver时,第{n}个driver命名为[driver{n}]
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
在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
[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
可使用如下两种方法提交测试(示例测试参数文件为config.xml)
sh cli.sh submit {test.xml}
命令提交测试[root@node241 0.4.2.c4]# sh cli.sh submit conf/config.xml
http://{controller-ip}:19088/controller
,点击submit new workloads
url,提交测试文件便可使用命令行接口
在controller节点cosbench目录下,使用sh cli.sh info
命令查看当前运行任务
使用web控制台
web访问控制台地址http://{controller-ip}:19088/controller
,点击对应任务view details
url,查看当前运行状态及结果
在测试参数文件中,auth
、storage
、storage
、work
定义中支持config
属性配置,该属性包含一个可选的参数列表(使用键值对格式表示,如"a=a_val;b=b_val")
表达式 | 格式 | 注释 |
---|---|---|
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 |
注:通常经常使用的选择器一般为c(number)、u(min,max)、s(min,max)
基于元素类型和工做类型的选择器有额外的约束,下面两个表列出了容许的组合
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() |
本小节主要介绍工做负载参数定义,一般为标签对目录结构的xml文件,目录结构示意以下:
<workload> <auth /> #可选项 <storage /> <workflow> <workstage> <auth /> #可选项 <storage /> #可选项 <work /> <auth /> #可选项 <storage /> #可选项 <operation /> </workstage> </workflow> </workload>
相关说明:
workload
-workstage
-work
-operation
<?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>
<?xml version="1.0" encoding="UTF-8" ?> <workload name="s3-sample" description="sample benchmark for s3"> </workload>
cosbench认证机制有none
、mock
、swauth
、keystone
、httpauth
<auth type="none" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
Caching | 布尔型 | false | 是否缓存认证信息 |
参数 | 类型 | 默认值 | 注释 |
--- | --- | --- | --- |
type | 字符串 | “cdmi” | 选项:“cdmi”或“non-cdmi”,它表示要使用的内容类型,“cdmi”表示存储访问将遵循cdmi内容类型,“non-cdmi”表示存储访问将遵循非cdmi内容类型. |
Customer_headers | 字符串 | 这是一个实验参数,用于查看是否可能支持cdmi衍生物,这可能须要额外的标头。 能够在不通知的状况下移除该参数。 |
<auth type="mock" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
token | 字符串 | “token” | Token字符串 |
delay | 长整型 | 20 | 延迟时间(以毫秒为单位) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
<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 | 指定认证失败时的重试次数 |
<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 | 指定认证失败时的重试次数 |
<auth type="httpauth" config="username={username};password={password};auth_url=http://{controller-ip}:8080/" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
auth_url | 字符串 | http://{controller-ip}:8080/ | auth节点的URL |
username | 字符串 | 用于认证的用户名。 | |
password | 字符串 | 用于认证的密码 | |
timeout | 整型 | 30,000 | 链接超时值(毫秒) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
<storage type="none" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
<storage type="mock" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
size | 整型 | 1024 | 对象大小(字节) |
delay | 整型 | 10 | 延迟时间(毫秒) |
errors | 整型 | 0 | 设置错误限制以模拟失败 |
printing | 布尔型 | False | 是否打印出数据内容 |
<storage type="swift" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 链接超时值(毫秒) |
token | 字符串 | AUTH_xxx | 认证令牌,只有在用户但愿绕过认证时才须要此参数。 |
storage_url | 字符串 | http://127.0.0.1:8080/auth/v1.0 | 存储URL,只有在用户但愿绕过认证时才须要此参数。 |
policy | 字符串 | 存储策略是Swift 2.0中引入的一项功能,容许应用程序在每一个容器的基础上为其存储选择一组不一样的特征。 有关完整信息,请参阅最新的Swift文档:http://docs.openstack.org/developer/swift/overview_architecture.html. 只有当用户但愿利用不一样的存储策略而不是默认存储策略时,才须要它。 |
<storage type="ampli" config="host={controller-ip};port=8080;nsroot=/namespace;policy={policy-id}" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 链接超时值(毫秒) |
host | 字符串 | 要链接的controller节点IP | |
port | 整型 | 端口 | |
nsroot | 字符串 | “/namespace” | 命名空间root |
policy | 字符串 | 命名空间将访问的策略ID |
<storage type="s3" config="accesskey={accesskey};secretkey={scretkey};endpoint={endpoint}; proxyhost={proxyhost};proxyport={proxyport}" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 链接超时值(毫秒) |
accesskey | 字符串 | base64编码的用户名 | |
secretkey | 字符串 | base64编码的密码 | |
endpoint | 字符串 | http://s3.amazonaws.com | 端点url(s3存储公开以供外部访问的url). |
proxyhost | 字符串 | 非必选项,按需配置,http代理主机名或IP地址 | |
proxyport | 整型 | 非必选项,按需配置,http代理端口。 |
<storage type="sproxyd" config="hosts={host1,host2,…};port={port};base_path={path};pool_size={maxTotal,maxPerRoute}" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
hosts | 字符串 | 127.0.0.1 | 以逗号分隔的主机名/IP地址列表。 使用简单的循环算法在全部主机上实现请求的负载平衡 |
port | 整型 | 81 | connector使用的端口 |
base_path | 字符串 | /proxy/chord | sproxyd配置文件的路径(此配置文件必须具备by_path_enabled=1) |
pool_size | 整型或逗号分隔的整数对 | 60,10 | 第一个值是链接池的大小。 第二个值(若是提供)是给定HTTP路由的最大链接数。 |
<storage type="cdmi" config="type=<cdmi|non-cdmi;custom_headers=<header:value_reference>" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
type | 字符串 | “cdmi” | 选项:“cdmi”或“non-cdmi”,它表示要使用的内容类型,“cdmi”表示存储访问将遵循cdmi内容类型,“non-cdmi”表示存储访问将遵循非cdmi内容类型 |
Customer_headers | 字符串 | 这是一个实验参数,用于查看是否可能支持cdmi衍生物,这可能须要额外的标头。 能够在不通知的状况下移除该参数 |
<storage type="cdmi_swift" config="" />
config
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 链接超时值(毫秒) |
<storage type="librados" config="endpoint={endpoint};accesskey={accesskey};secretkey={secretkey}" />
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
endpoint | 字符串 | 127.0.0.1 | 端点能够是例如监视器节点。 |
accesskey | 字符串 | 用户名如“admin”。 | |
secretkey | 字符串 | secretkey是admin keyring的key。 |
<workstage name="<name>" > </workstage>
<work name="main" type="normal" workers="128" interval="5" division="none" runtime="60" rampup="0" rampdown="0" totalOps="0" totalBytes="0" afr=”200000” config="" > . . . </work>
有一种常规work(normal
)和四种特殊work(init
、prepare
、cleanup
、dispose
),上面示例参数针对全部组合状况,不一样工做类型会有不一样的参数组合,通常规则以下:
workers
控制负载状况runtime
(包括rampup
和rampdown
)、totalOps
、totalBytes
控制负载何时结束,通常一个work定义只能设置其中一种,特殊work不须要定义此项参数属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | work的一个名称 | |
type | 字符串 | normal | work的类型,可选参数为normal、init、prepare、cleanup、dispose、delay |
workers | 整型 | 并行进行work的workers数量,即同时起多少个线程运行负载 | |
interval | 整型 | 5 | 性能快照之间的间隔,即多久统计一次性能数据 |
division | 字符串 | none | 控制workers之间的work分配方式,可选参数为none、container、object |
runtime | 整型 | 0 | 结束选项,work将执行多少秒 |
rampup | 整型 | 0 | 结束选项,加速工做负载的秒数(须要多少秒来增长工做负载);此时间不包括在runtime中 |
rampdown | 整型 | 0 | 结束选项,减速工做负载的秒数(须要多少秒来减小工做负载);此时间不包括在runtime中 |
totalOps | 整型 | 0 | 结束选项,将执行多少个操做;应该是workers的倍数 |
totalBytes | 整型 | 0 | 结束选项,要传输多少字节,应该是workers和size的乘积的倍数。 |
driver | 字符串 | 将执行此work的driver,默认状况下,全部driver都将参与执行,可手动指定该work由哪一个driver执行负载测试 | |
afr | 整型 | 200000(常规work类型) 0(特殊work类型) |
可接受的失败率,是百万分之一。 |
参数解释
none
、container
、object
init
/dispose
,默认的划分策略为container
prepare
/cleanup
,默认的划分策略为object
none
#示例参数以下: <work name="main" workers="4" runtime="300" division="?"> <operation type="read" ratio="100" config="containers=u(1,8);objects=u(1,1000)" /> </work>
若
division="container"
,则表示在当前work中,worker经过container
划分负载区域范围,访问模式示例以下:
注:workers
数量不容许超过container
Worker | Container Range | Object Range |
---|---|---|
#1 | 1-2 | 1-1000 |
#2 | 3-4 | 1-1000 |
#3 | 5-6 | 1-1000 |
#4 | 7-8 | 1-1000 |
若
division="object"
,则表示在当前work中,worker经过object
划分负载区域范围,访问模式示例以下:
注:wrokers
数量不容许超过objects
Worker | Container Range | Object Range |
---|---|---|
#1 | 1-8 | 1-250 |
#2 | 1-8 | 251-500 |
#3 | 1-8 | 501-750 |
#4 | 1-8 | 751-1000 |
<work type="init|prepare|cleanup|dispose|delay" workers="{number}" config="{key}={value};{key}={value}" />
特殊work与常规work有如下不一样的地方:
totalOps
并计算具体数值来控制负载运行时长,所以不须要额外去定义结束选项operation
)<work type="init" workers="4" config="containers=r(1,100)" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如: c(1), r(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
<work type="prepare" workers="4" config="containers=r(1,10);objects=r(1,100);sizes=c(64)KB" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如: c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 |
|
对象后缀 |
sizes | 字符串 | 带单位(B/KB/MB/GB)的大小选择表达式;例如: c(128)KB, u(2,10)MB | |
chunked | 布尔型 | False | 是否以chunked模式上传数据 |
content | 字符串 | random | 使用随机数据或全零填充对象内容,可选参数为random、zero |
createContainer | 布尔型 | False | 建立相关容器(若是不存在) |
hashCheck | 布尔型 | False | 作与对象完整性检查相关的工做 |
<work type="cleanup" workers="4" config="containers=r(1,10);objects=r(1,100)" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 |
|
对象后缀 |
deleteContainer | 布尔型 | False | 删除相关容器(若是存在) |
<work type="dispose" workers="4" config="containers=r(1,100)" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
<workstage name=”delay” closuredelay=”60” > <work type="delay" workers="1" /> </workstage>
注:closuredelay
即延迟时间(单位为秒)
注:ratio
为当前操做数占总操做数的比例,单个work定义中,全部operation的ratio
之和为100
<operation type="read" ratio="70" config="containers=c(1);objects=u(1,100)" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 |
|
对象后缀 |
hashCheck | 布尔型 | False | 作与对象完整性检查相关的工做 |
<operation type="write" ratio="20" config="containers=c(2);objects=u(1,1000);sizes=c(2)MB" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 |
|
对象后缀 |
sizes | 字符串 | 带单位(B/KB/MB/GB)的大小选择表达式;例如: c(128)KB, u(2,10)MB | |
chunked | 布尔型 | False | 是否以chunked模式上传数据 |
content | 字符串 | random | 使用随机数据或全零填充对象内容,可选参数为random、zero |
hashCheck | Boolean | False | 作与对象完整性检查相关的工做 |
<operation type="filewrite" ratio="20" config="containers=c(2);fileselection=s;files=/tmp/testfiles" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
fileselection | 字符串 | 哪一种选择器应该只使用put选择器标识符(例如,s表明顺序)。* | |
files | 字符串 | 包含要上载的文件的文件夹的路径,路径必须存在 | |
chunked | 布尔型 | False | 是否以chunked模式上传数据 |
hashCheck | 布尔型 | False | 作与对象完整性检查相关的工做 |
注:对象不按文件名读取。Java以随机方式读取文件夹中的文件。在第一个对象第二次被选中以前,使用“Sequential”选择器确保每一个对象将被选中一次。在工做定义中使用totalOps或runtime限制对象的数量
<operation type="delete" ratio="10" config="containers=c(2);objects=u(1,1000)" />
参数列表以下:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 |
|
容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 |
|
对象后缀 |
Op-Type
操做类型,经常使用操做类型有read
、write
、filewrite
、delete
,具体详见operation定义(type="")
Op-Count
总操做数
Byte-Count
总字节数
Avg-ResTime
时延(平均响应时间,请求开始到请求完成的持续时间)
Throughput(Operations/s)
IOPS(每秒完成的操做总数)
注:此处的值由总操做成功请求数除以总运行时间计算而来
Bandwidth
带宽(每秒传输的数据量)
注:此处数据量进制换算跟实际有所不一样(1 MB = 1000 × 1000 bytes),故测试的性能值要高于实际值
Succ-Ratio
操做成功率(成功请求数/总请求数)
一、为实现最大性能,此处endpoint
指向的为haproxy端口(后端使用均衡模式roundrobin,指向三个集群节点不一样网关)
二、全部测试模型执行前需手动清理下缓存sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
三、workers
通常设置为客户端CPU线程数总大小 grep 'processor' /proc/cpuinfo | sort -u | wc -l
四、objects
对象数需为wokers
并发数的整数倍,不然会由于线程数没法除尽,出现文件上传不全的状况
如并发数为32,上传对象10000个,实际上传对象为9984个
序号 | 客户端个数 | 客户端driver个数 | 单driver并发数 | 对象数量 | 对象大小 | 读写类型 | 读结果标识 | 写结果标识 |
---|---|---|---|---|---|---|---|---|
1. | 1 | 1 | 32 | 200000 | 4KB | 读写 | OR1 | OW1 |
2. | 3 | 1 | 32 | 600000 | 4KB | 读写 | OR2 | OW2 |
3. | 1 | 1 | 32 | 60000 | 4MB | 读写 | OR3 | OW3 |
4. | 3 | 1 | 32 | 180000 | 4MB | 读写 | OR4 | OW4 |
单个客户端,单个客户端线程数3二、100个桶、单桶2000个对象(共20w个对象)、单个对象大小4KB
<?xml version="1.0" encoding="UTF-8" ?> <workload name="4k-rw-1driver" description="sample benchmark for s3"> <storage type="s3" config="accesskey={userak};secretkey={usersk};endpoint=http://{haproxy-ip}:{port};timeout=300000;max_connections=400" /> <workflow> <workstage name="init"> <work type="init" workers="10" config="cprefix=test4kbucket;containers=r(1,100)" /> </workstage> <workstage name="write test4k"> <work type="prepare" workers="32" driver="driver1" config="cprefix=test4kbucket;containers=r(1,100);objects=r(1,2000);sizes=c(4)KB" /> </workstage> <workstage name="read test4k"> <work name="read" workers="32" driver="driver1" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4kbucket;containers=u(1,100);objects=u(1,2000)" /> </work> </workstage> <workstage name="cleanup"> <work type="cleanup" workers="32" config="cprefix=test4kbucket;containers=r(1,100);objects=r(1,2000)" /> </workstage> <workstage name="dispose"> <work type="dispose" workers="10" config="cprefix=test4kbucket;containers=r(1,100)" /> </workstage> </workflow> </workload>
三个客户端,单个客户端线程数3二、100个桶、单桶2000个对象(共60w个对象)、单个对象大小4KB
<?xml version="1.0" encoding="UTF-8" ?> <workload name="4k-rw-3driver" description="sample benchmark for s3"> <storage type="s3" config="accesskey={userak};secretkey={usersk};proxyhost=;proxyport=;endpoint=http://{haproxy-ip}:{port};timeout=300000;max_connections=400" /> <workflow> <workstage name="init"> <work type="init" workers="10" config="cprefix=test4kbucket;containers=r(1,300)" /> </workstage> <workstage name="write test4k"> <work type="prepare" workers="32" driver="driver1" config="cprefix=test4kbucket;containers=r(1,100);objects=r(1,2000);sizes=c(4)KB" /> <work type="prepare" workers="32" driver="driver2" config="cprefix=test4kbucket;containers=r(101,200);objects=r(1,2000);sizes=c(4)KB" /> <work type="prepare" workers="32" driver="driver3" config="cprefix=test4kbucket;containers=r(201,300);objects=r(1,2000);sizes=c(4)KB" /> </workstage> <workstage name="read test4k"> <work name="read" workers="32" driver="driver1" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4kbucket;containers=u(1,100);objects=u(1,2000)" /> </work> <work name="read" workers="32" driver="driver2" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4kbucket;containers=u(101,200);objects=u(1,2000)" /> </work> <work name="read" workers="32" driver="driver3" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4kbucket;containers=u(201,300);objects=u(1,2000)" /> </work> </workstage> <workstage name="cleanup"> <work type="cleanup" workers="32" config="cprefix=test4kbucket;containers=r(1,300);objects=r(1,2000)" /> </workstage> <workstage name="dispose"> <work type="dispose" workers="10" config="cprefix=test4kbucket;containers=r(1,300)" /> </workstage> </workflow> </workload>
一个客户端,单个客户端线程数3二、100个桶、单桶600个对象(共6w个对象)、单个对象大小4MB
<?xml version="1.0" encoding="UTF-8" ?> <workload name="4m-rw-1driver" description="sample benchmark for s3"> <storage type="s3" config="accesskey={userak};secretkey={usersk};proxyhost=;proxyport=;endpoint=http://{haproxy-ip}:{port};timeout=300000;max_connections=400" /> <workflow> <workstage name="init"> <work type="init" workers="10" config="cprefix=test4mbucket;containers=r(1,100)" /> </workstage> <workstage name="write test4m"> <work type="prepare" workers="32" driver="driver1" config="cprefix=test4mbucket;containers=r(1,100);objects=r(1,600);sizes=c(4096)KB" /> </workstage> <workstage name="read test4m"> <work name="read" workers="32" driver="driver1" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4mbucket;containers=u(1,100);objects=u(1,600)" /> </work> </workstage> <workstage name="cleanup"> <work type="cleanup" workers="32" config="cprefix=test4mbucket;containers=r(1,100);objects=r(1,600)" /> </workstage> <workstage name="dispose"> <work type="dispose" workers="10" config="cprefix=test4mbucket;containers=r(1,100)" /> </workstage> </workflow> </workload>
三个客户端,单个客户端线程数3二、100个桶、单桶600个对象(共18w个对象)、单个对象大小4MB
<?xml version="1.0" encoding="UTF-8" ?> <workload name="4m-rw-3driver" description="sample benchmark for s3"> <storage type="s3" config="accesskey={userak};secretkey={usersk};proxyhost=;proxyport=;endpoint=http://{haproxy-ip}:{port};timeout=300000;max_connections=400" /> <workflow> <workstage name="init"> <work type="init" workers="10" config="cprefix=test4mbucket;containers=r(1,300)" /> </workstage> <workstage name="write test4m"> <work type="prepare" workers="32" driver="driver1" config="cprefix=test4mbucket;containers=r(1,100);objects=r(1,600);sizes=c(4096)KB" /> <work type="prepare" workers="32" driver="driver2" config="cprefix=test4mbucket;containers=r(101,200);objects=r(1,600);sizes=c(4096)KB" /> <work type="prepare" workers="32" driver="driver3" config="cprefix=test4mbucket;containers=r(201,300);objects=r(1,600);sizes=c(4096)KB" /> </workstage> <workstage name="read test4m"> <work name="read" workers="32" driver="driver1" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4mbucket;containers=u(1,100);objects=u(1,600)" /> </work> <work name="read" workers="32" driver="driver2" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4mbucket;containers=u(101,200);objects=u(1,600)" /> </work> <work name="read" workers="32" driver="driver3" runtime="300"> <operation type="read" ratio="100" config="cprefix=test4mbucket;containers=u(201,300);objects=u(1,600)" /> </work> </workstage> <workstage name="cleanup"> <work type="cleanup" workers="32" config="cprefix=test4mbucket;containers=r(1,300);objects=r(1,600)" /> </workstage> <workstage name="dispose"> <work type="dispose" workers="10" config="cprefix=test4mbucket;containers=r(1,300)" /> </workstage> </workflow> </workload>
Terminate
错误radosgw-admin bucket stats --bucket={bucket-name} | grep num_objects
注:通常测试读模型时,须要预填准备测试数据,此时上传对象须要使用
s(min,max)
表达式顺序执行,从而保证读取的对象数据彻底
注:此处引用文章
**COSBench测Ceph对象存储:那些网上找不到的细节**
radosgw-admin bucket stats –bucket={bucket-name}
查看桶内对象数是否达到指定用例规模;