参考资料: https://blog.csdn.net/QTM_Gitee/article/details/100067724 https://github.com/intel-cloud/cosbench/blob/master/COSBenchUserGuide.pdf COSBench测Ceph对象存储:那些网上找不到的细节
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对象存储
cosbench可以联机测试,主要有以下两个关键组件:
driver cosbench负载生成器,主要负责工作负载生成,发布针对云对象存储的操作和收集性能统计信息 可以通过http://{driver-ip}:18088/driver地址访问
controller cosbench控制器,主要负责协调负载生成器共同执行工作负载,收集来自负载生成器的基准性能测试结果 可以通过http://{controller-ip}:19088/controller地址访问 注:controller和driver角色可以部署在同一个节点上
下载jre版本包,解压缩至/opt目录下
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环境变量
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/profilecontroller和driver之间通信需要依赖nc环境
执行yum install -y nmap-ncat命令在线安装ncat包
通常情况下,系统默认已经安装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角色node24166.66.66.241controller、drivernode24266.66.66.242drivernode24366.66.66.243drivercontroller和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]
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目录内[driverx] 当有多个driver时,第{n}个driver命名为[driver{n}]
name 用于标识driver节点的标签,名称可以自定义url 访问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节点的地址在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)
使用命令行接口 在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,提交测试文件即可 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ea58GjRg-1603363225801)(index_files/27437dd6-3cf5-49b3-bb8f-21bcd38f42c7.png)]使用命令行接口 在controller节点cosbench目录下,使用sh cli.sh info命令查看当前运行任务
使用web控制台 web访问控制台地址http://{controller-ip}:19088/controller,点击对应任务view detailsurl,查看当前运行状态及结果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yM0n5fhz-1603363225803)(index_files/cb40026d-dcdc-4a3e-9b52-a3105ef6517f.png)]
在测试参数文件中,auth、storage、storage、work定义中支持config属性配置,该属性包含一个可选的参数列表(使用键值对格式表示,如"a=a_val;b=b_val") [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9KTeZ4P-1603363225805)(index_files/721ac895-0958-4f1e-bbf6-2a1ffea3d7f3.png)]
在参数列表中,常用的键包括containers、objects、sizes,用来指定如何选择容器、对象、大小注:一般常用的选择器通常为c(number)、u(min,max)、s(min,max)
基于元素类型和工作类型的选择器有额外的约束,下面两个表列出了允许的组合
元素类型选择器 Keyconstant (c(num))uniform (u(min,max))range (r(min,max))sequential (s(min,max))histogram(h(min|max|ratio))containers✔✔✔✔objects✔✔✔✔sizes✔✔✔✔ 工作类型选择器 Keyinitpreparenormal (read)normal (write)normal (delete)cleanupdisposecontainersr(), s()r(), s()c(), u(), r(), s()c(), u(), r(), s()c(), u(), r(), s()r(), s()r(), s()objectsr(), s()c(), u(), r(), s()c(), u(), r()c(), u(), r(), s()r(), s()sizesc(), u(), h()c(), u(), h()本小节主要介绍工作负载参数定义,通常为标签对目录结构的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>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.0auth节点的URL,一般为controller节点username字符串用于认证的用户名,语法account:userpassword字符串用于认证的密码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.0auth节点的URLusername字符串用于认证的用户名。 语法account:userpassword字符串用于认证的密码tenant_name字符串用户所属的租户名称service字符串swift请求的服务timeout整型30,000连接超时值(毫秒)retry整型0指定认证失败时的重试次数 httpauth (Http BASIC/DIGEST) <auth type="httpauth" config="username={username};password={password};auth_url=http://{controller-ip}:8080/" />config参数列表如下:
参数类型默认值注释auth_url字符串http://{controller-ip}:8080/auth节点的URLusername字符串用于认证的用户名。password字符串用于认证的密码timeout整型30,000连接超时值(毫秒)retry整型0指定认证失败时的重试次数config参数列表如下:
参数类型默认值注释logging布尔型false将信息打印到日志 delay specified time <storage type="mock" config="" />config参数列表如下:
参数类型默认值注释logging布尔型false将信息打印到日志size整型1024对象大小(字节)delay整型10延迟时间(毫秒)errors整型0设置错误限制以模拟失败printing布尔型False是否打印出数据内容 Swift (OpenStack Swift) <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. 只有当用户希望利用不同的存储策略而不是默认存储策略时,才需要它。 Ampli (Amplidata) <storage type="ampli" config="host={controller-ip};port=8080;nsroot=/namespace;policy={policy-id}" />config参数列表如下:
参数类型默认值注释timeout整型30,000连接超时值(毫秒)host字符串要连接的controller节点IPport整型端口nsroot字符串“/namespace”命名空间rootpolicy字符串命名空间将访问的策略ID S3 (Amazon S3) <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代理端口。 Sproxyd (Scality) <storage type="sproxyd" config="hosts={host1,host2,…};port={port};base_path={path};pool_size={maxTotal,maxPerRoute}" />config参数列表如下:
参数类型默认值注释hosts字符串127.0.0.1以逗号分隔的主机名/IP地址列表。 使用简单的循环算法在所有主机上实现请求的负载平衡port整型81connector使用的端口base_path字符串/proxy/chordsproxyd配置文件的路径(此配置文件必须具有by_path_enabled=1)pool_size整型或逗号分隔的整数对60,10第一个值是连接池的大小。 第二个值(如果提供)是给定HTTP路由的最大连接数。 Cdmi (SNIA CDMI) <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衍生物,这可能需要额外的标头。 可以在不通知的情况下移除该参数 Cdmi_swift (SNIA CDMI for swift) <storage type="cdmi_swift" config="" />config参数列表如下:
参数类型默认值注释timeout整型30,000连接超时值(毫秒) librados (for Ceph) <storage type="librados" config="endpoint={endpoint};accesskey={accesskey};secretkey={secretkey}" /> 参数类型默认值注释endpoint字符串127.0.0.1端点可以是例如监视器节点。accesskey字符串用户名如“admin”。secretkey字符串secretkey是admin keyring的key。有一种常规work(normal)和四种特殊work(init、prepare、cleanup、dispose),上面示例参数针对所有组合情况,不同工作类型会有不同的参数组合,一般规则如下:
通常使用workers控制负载情况通常使用runtime(包括rampup和rampdown)、totalOps、totalBytes控制负载什么时候结束,一般一个work定义只能设置其中一种,特殊work不需要定义此项参数 参数列表如下: 属性类型默认值注释name字符串work的一个名称type字符串normalwork的类型,可选参数为normal、init、prepare、cleanup、dispose、delayworkers整型并行进行work的workers数量,即同时起多少个线程运行负载interval整型5性能快照之间的间隔,即多久统计一次性能数据division字符串none控制workers之间的work分配方式,可选参数为none、container、objectruntime整型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类型)可接受的失败率,是百万分之一。参数解释
division(划分策略) 1.1. division用于将一个work划分为多个不重叠区域,这些区域有着较小的容器或者对象范围,支持的策略有none、container、object 1.2. 不同阶段有不同的默认划分策略 对于init/dispose,默认的划分策略为container 对于prepare/cleanup,默认的划分策略为object 对于常规work,默认划分策略为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
WorkerContainer RangeObject Range#11-21-1000#23-41-1000#35-61-1000#47-81-1000若division="object",则表示在当前work中,worker通过object划分负载区域范围,访问模式示例如下: 注:wrokers数量不允许超过objects
WorkerContainer RangeObject Range#11-81-250#21-8251-500#31-8501-750#41-8751-1000特殊work与常规work有以下不同的地方:
它内部采用totalOps并计算具体数值来控制负载运行时长,因此不需要额外去定义结束选项它有隐形定义的操作,因此不需要额外再定义具体操作内容(operation)"delay"与其他不同,这会导致work只休眠指定的秒数参数列表如下:
参数类型默认值注释containers字符串容器选择表达式;例如: c(1), r(1,100)cprefix字符串mycontainers_容器前缀csuffix字符串容器后缀 prepare(批量创建特定对象) <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)MBchunked布尔型False是否以chunked模式上传数据content字符串random使用随机数据或全零填充对象内容,可选参数为random、zerocreateContainer布尔型False创建相关容器(如果不存在)hashCheck布尔型False做与对象完整性检查相关的工作 cleanup(批量删除特定对象) <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删除相关容器(如果存在) dispose(批量删除特定桶) <work type="dispose" workers="4" config="containers=r(1,100)" />参数列表如下:
参数类型默认值注释containers字符串容器选择表达式;例如 c(1), u(1,100)cprefix字符串mycontainers_容器前缀csuffix字符串容器后缀 delay(插入几秒的延迟) <workstage name=”delay” closuredelay=”60” > <work type="delay" workers="1" /> </workstage>注:closuredelay即延迟时间(单位为秒)
注:ratio为当前操作数占总操作数的比例,单个work定义中,所有operation的ratio之和为100
read(读) <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做与对象完整性检查相关的工作 write(写) <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)MBchunked布尔型False是否以chunked模式上传数据content字符串random使用随机数据或全零填充对象内容,可选参数为random、zerohashCheckBooleanFalse做与对象完整性检查相关的工作 filewrite(上传) <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限制对象的数量
delete(删除) <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 操作成功率(成功请求数/总请求数)
1、为实现最大性能,此处endpoint指向的为haproxy端口(后端使用均衡模式roundrobin,指向三个集群节点不同网关) 2、所有测试模型执行前需手动清理下缓存sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3、workers一般设置为客户端CPU线程数总大小 grep 'processor' /proc/cpuinfo | sort -u | wc -l 4、objects对象数需为wokers并发数的整数倍,否则会因为线程数无法除尽,出现文件上传不全的情况 如并发数为32,上传对象10000个,实际上传对象为9984个
单个客户端,单个客户端线程数32、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>三个客户端,单个客户端线程数32、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>一个客户端,单个客户端线程数32、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>三个客户端,单个客户端线程数32、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>注:一般测试读模型时,需要预填准备测试数据,此时上传对象需要使用s(min,max)表达式顺序执行,从而保证读取的对象数据完全
注:此处引用文章**COSBench测Ceph对象存储:那些网上找不到的细节**
