目录
简略说明
原理
用法
详细说明
简介
用法
一 安装
二 简单验证
三 编写配置文件
四 提交配置文件下IO
五 测试结果查看
结果概览
查看详情
每秒钟的io情况查看
工作负载配置
参数配置(controller和driver)
查看错误的方法和错误记录
查看错误的方法
错误记录
简略说明
COSBench是一个用于测试对象存储系统的分布式基准测试工具
原理
存储集群建立网关,cosbench连接网关,根据用户提交的xxx.xml向集群下IO(网关地址,key,和怎么下IO在配置文件xxx.xml中配置了)
用法
1,安装:
下载cosbench:https://github.com/intel-cloud/cosbench工具,放到压力机上,解压。
(COSBench0.4.2.c4.zip资源-CSDN文库)
2,启动cosbench服务:
sh start-all.sh
这个时候就可以访问你启动的cosbench了: http://<IP>:19088/controller/index.html #<IP>替换成实际地址
3,编写xml配置文件
(集群提前创建好网关,客户端(key))样例如下,文章后面会教你怎么写。
4,提交任务(xml配文件)
在主页 http://<IP>:19088/controller/index.html 点击submit new workloads,然后选择你编写的xml配置文件,提交,cosbench就开始向你xml里面知道网关,按xml里面定义的操作,向集群下IO
详细说明
简介
COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench
cosbench 由两个主要组件组成Driver和Controller。
Driver(Load Generator,打工的):
负责生成工作负载,向目标对象存储发出操作(读取用户的xml配置,向集群下IO);性能统计。可通过http://:18088/driver/index.html访问
Controller(工头):
负责协调drivers集体执行工作,收集和汇总聚合来自driver实例的运行时状态或基准测试结果。(就是比如你要多台服务器做压力机,在一台机器做Controller,Controller根据配置控制多台压力机下某个集群下IO)
两个组件可以混合部署在一个节点上,也可以分开来部署.(比如,我们如果只有一台服务器做压力机,那我们就Controller和Driver都在这台机器上启动,这台机器既是工头又是打工的,自己控制自己下IO)
下图是,一个服务器做Controller,控制两台机器下IO)
做工头(Controller)的服务器启动start-Controller.sh脚本,做打工(driver)的服务器启动start-driver.sh脚本,(只有一台服务的情况)即做工头(Controller)又打工(driver)的,即启动start-all.sh
工头控制那些打工的,通过conf/controller.conf文件配置,如下,只有一个打工的driver1:
更详细的配置见后面的《参数配置(controller和driver)》
用法
一 安装
1、 下载COSBench工具
下载地址为:https://github.com/intel-cloud/cosbench,下载最新的包
(COSBench0.4.2.c4.zip资源-CSDN文库)
2、 将包放至linux任意目录中,进行解压unzip xxx.zip
3、 解压后,里面有说明文档:COSBenchUserGuide.pdf
4、 安装依赖java 和curl
yum install java curl
(COSBench底层调用了linux nc来做数据分析,所以如果linux没装nc的需要手工安装nc)
2、文件说明
官方英文使用文档(超详细,可以翻翻看)
[root@ceph-node1 0.4.2.c4]# ll *.pdf
3rd-party-licenses.pdf
COSBenchAdaptorDevGuide.pdf
COSBenchUserGuide.pdf
服务调用脚本说明
[root@ceph-node1 0.4.2.c4]# ll *.sh
cli.sh #通过命令行操作cosbench
cosbench-start.sh #其他启动脚本调用的脚本
cosbench-stop.sh #其他启动脚本调用的脚本
start-all.sh #在当前节点启动driver和controller组件
stop-all.sh #在当前节点停止driver和controller组件
start-controller.sh #在当前节点启动controller
start-driver.sh #在当前节点启动driver
stop-controller.sh #在当前节点关闭controller
stop-driver.sh #在当前节点关闭driver
二 简单验证
启动cosbench
启动前为了保证driver和controller之间交互正常,需要关闭HTTP代理
[root@ceph-node1 0.4.2.c4]# unset http_proxy
启动controller和driver (服务器即做工头又做打工的)
[root@ceph-node10.4.2.c4]# sh start-all.sh
验证
controller在初始化时读取conf/controller.conf配置文件启动控制器服务,看配置文件可知controller的访问地址是http://<IP>:19088/controller/index.html
访问http://<IP>:19088/controller/index.html验证。
三 编写配置文件
cosbench使用负载配置文件向对象存储下发测试任务。
负载配置文件含如下参数:
- 网关节点ip和端口,或者高可用组的vip和端口,或者域名和端口;
- 对象存储用户的ak/sk;
在conf目录下有很多配置样例,详细说明,见后面的《工作负载配置》
四 提交配置文件下IO
有两种方法:
1,命令行:
bash cli.sh submit conf/s3-config-sample.xml
访问http://<IP>:19088/controller/index.html 就可以看到执行情况
2,web界面提交
在主页 http://<IP>:19088/controller/index.html 点击submit new workloads,然后选择xml配置文件
五 测试结果查看
结果概览
每个阶段执行完后,可以在web界面看到iops、带段等结果:
General Report这一栏,每个值的含义如下:
- Op-Type : 操作类型
- Op-Count : 操作总数
- Byte-Count : 操作产生的Byte
- Avg-ResTime:平均时延,它为存储服务处理请求的时间,包含数据传输时间,一般小文件(比如KB级别)我们也会关注这个值,此值越低,小文件的IOPS越好
- Avg-ProcTime:平均处理时间,它为存储服务处理请求的时间,不包含数据传输时间
- Throughput:吞吐量,当我们的文件粒度为1M及以下时,着重关注这个值,描述了当前文件粒度下的读写等性能(IOPS)
- Bandwidth:带宽,当我们的文件粒度为1M以上时,着重关注这个值,描述了当前文件粒度下的读写等性能(MB/s等单位)
- Succ-Ratio:请求成功率,这里一般都要求100%
也可以在任务ID,在cosbench安装目录的archive子目录中看到测试结果:
每个任务ID对应的目录下,都按照阶段生成了相应的csv文件,下载对应的csv文件用execel查看即可:
查看详情
每秒钟的io情况查看
如查看wid=w12&sid=s2-prepare 的每秒钟IO
在将 http://10.255.136.7:19088/controller/stage.html?wid=w12&sid=s2-prepare 中的stage.html 改成 timeline.html ,回车即可
工作负载配置
在conf目录下有很多配置样例
进入conf目录下,查看s3-config-sample.xml配置文件内容如下:
配置参数和说明:
<?xml version="1.0" encoding="utf-8"?> <!--workload name : 测试时显示的任务名称,可自定义;description : 描述信息--> <workload name="s3-sample" description="sample benchmark for s3"> <!--storage type: 存储类型,这里配置为s3即可--> <storage type="s3" config="accesskey='填访问key';secretkey='填安全key';proxyhost='填代理ip或域名,可以不使用代理';proxyport='如果用了代理,填代理端口';endpoint='填对象存储系统的网关的地址http:/ip:端口';" /> <!--workflow工作流,workstage name:cosbench是分阶段按顺序执行,每个阶段的名字--> <workflow> <workstage name="init"> <!--workers:该阶段开启多少工作线程;config:存储桶bucket的名称前缀;containers:轮询数,如本例创建以s3testqwer为前缀,后缀分别为1和2的bucket--> <work type="init" workers="1" config="cprefix=s3testqwer;containers=r(1,2)" /> </workstage>
<!--prepare阶段,配置写入的数据;workers\config\containers与init阶段相同;objects:一轮写入多少个对象以及object的大小--> <workstage name="prepare"> <!--一个worker处理该阶段,r就是range,轮询1,2两个容器(桶),前缀是s3testqwer,每个容器写入10个 objecter,尺寸是64KB--> <work type="prepare" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,10);sizes=c(64)KB" /> </workstage> <!--main阶段:测试阶段;runtime:运行的时间,默认为秒--> <workstage name="main"> <work name="main" workers="8" runtime="30"> <!--op type:操作类型read、write、delete等;ratio操作占比,read的比例为80%,write的比例为20%; --> <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> <!--清理阶段:主要是删除bucket中的数据,保证测试后的数据不会保留在集群中--> <workstage name="cleanup"> <work type="cleanup" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,20)" /> </workstage>
<!--dispose阶段:删除bucket--> <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
|
参数配置(controller和driver)
测试案例配置
cosbench工具使用按照流程可分为以下几个步骤:参数配置--服务启动--提交测试--分析结果
示例使用三个节点联机测试,配置示意如下:
调整时差,客户机和集群的时差不要太大。
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命名为[driver{n}]
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 |
查看错误的方法和错误记录
查看错误的方法
1,点击download-log 下载log
查看下载下来log内容
1、main阶段failed
点击“view details”,找到Mission ID:
在cosbench安装目录的log/mission目录下,找到该mission id对应的日志文件,从日志文件中查看报错:
错误记录
Status Code: 500
Status Code: 500
2024-03-11 20:36:36,483 [ERROR] [AbstractOperator] - worker 13 fail to perform operation s3testqwer25
com.intel.cosbench.api.storage.StorageException: com.amazonaws.services.s3.model.AmazonS3Exception: We encountered an internal error, please try again.: cause(save bucket metadata to ns failed!s3testqwer25) (Service: Amazon S3; Status Code: 500; Error Code: InternalError; Request ID: 17BBB600BD8B7581), S3 Extended Request ID: 1a6d04ea-b557-4018-9ced-cc23e3798466
at com.intel.cosbench.api.S3Stor.S3Storage.createContainer(S3Storage.java:149)
at com.intel.cosbench.driver.operator.Preparer.doInit(Preparer.java:113)
at com.intel.cosbench.driver.operator.Preparer.operate(Preparer.java:87)
at com.intel.cosbench.driver.operator.AbstractOperator.operate(AbstractOperator.java:76)
at com.intel.cosbench.driver.operator.Initializer.operate(Initializer.java:1)
at com.intel.cosbench.driver.agent.WorkAgent.performOperation(WorkAgent.java:197)
at com.intel.cosbench.driver.agent.WorkAgent.doWork(WorkAgent.java:177)
at com.intel.cosbench.driver.agent.WorkAgent.execute(WorkAgent.java:134)
at com.intel.cosbench.driver.agent.AbstractAgent.call(AbstractAgent.java:44)
at com.intel.cosbench.driver.agent.AbstractAgent.call(AbstractAgent.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
原因
1,对象数据池没有创建
which: no nc in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
如果不安装nc,会报错
which: no nc in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
Ncat: Connection refused.
No appropriate tool found to detect cosbench driver status.
如果不安装java,会报
Ncat: Connection refused.
启动失败
摘自:尝试在CentOS 7上启动cosbench遭遇的一些问题 - 之一 - 中道学友 - 博客园 (cnblogs.com)
尝试启动cosbench,遭遇报错:
[root]hopisdtmelabs14# cat driver-boot.log /tmp/cosbench/0.4.2/log
java.net.BindException: Address already in use (Bind failed)
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at org.eclipse.osgi.framework.internal.core.ConsoleManager.startConsole(ConsoleManager.java:186)
at org.eclipse.osgi.framework.internal.core.ConsoleManager.startConsole(ConsoleManager.java:132)
at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:269)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:175)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
!SESSION 2020-06-03 06:04:23.609 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.8.0_181
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments: -console 18089
!ENTRY org.eclipse.osgi 4 0 2020-06-03 06:04:24.132
!MESSAGE Bundle plugins/cosbench-castor not found.
看起来像是网络端口18089已经被占用了,杀掉那些进程,问题解决。
如何找到占用18089端口的进程?举例如下:
# netstat -tulpn | grep 18089 /tmp/cosbench/cos/conf
tcp6 0 0 :::18089 :::* LISTEN 4090/java
# ps aux | grep java /tmp/cosbench/cos/conf
root 4090 0.0 0.4 21453452 315076 ? Sl 10:39 0:18 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 4822 0.3 0.3 20319980 262324 pts/0 Sl 21:13 0:07 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 4965 0.0 0.0 112828 2316 pts/0 S+ 21:46 0:00 grep --color=auto java
可以看出来在上面的例子中,4090就是占用了18089端口的进程号了,通过ps aux 还能看到详细的命令行参数。
但cosbench driver 还是启动不了。
[root]hopisdtmelabs14# bash ./start-driver.sh /tmp/cosbench/cos
Launching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
which: no nc in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tme/bin:/usr/local/tme/tme_portal/perf_web/bin)
No appropriate tool found to detect cosbench driver status.
看报错,应该是nc(ncat)这个软件没有安装。可是通过yum还没法正常安装。我通过下面的命令解决了这个问题:
# yum -y install wget
# wget https://nmap.org/dist/ncat-7.80-1.x86_64.rpm
# yum localinstall ncat-7.80-1.x86_64.rpm
# cd /usr/bin
# ln -s ncat nc
装好了nc之后,还是有错误。
# bash ./start-driver.sh /tmp/cosbench/cos
Launching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
...........................................................
Starting cosbench-log_0.4.2 [ERROR]
...........................................................
Starting cosbench-tomcat_0.4.2 [ERROR]
..........................................................
Starting cosbench-config_0.4.2 [ERROR]
...........................................................
Starting cosbench-http_0.4.2 [ERROR]
我怀疑是我的java的版本过高,所以卸掉java 8, 安装java 7。
# rpm -aq | grep -i jdk /tmp/cosbench/cos
java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-headless-1.8.0.181-3.b13.el7_5.x86_64
# rpm -e java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
# rpm -e java-1.8.0-openjdk-headless-1.8.0.181-3.b13.el7_5.x86_64
# yum remove java
安装java 7.
#yum install java-1.7.0-openjdk
结果遇到了报错,说有两个软件包太旧了,达不到安装的要求。
尝试安装更新,结果还是报错,无法更新。
[Errno 14] HTTP/HTTPS Error 404
于是执行下面的命令,对yum进行修复。
#yum clean all
#rm -rf /var/cache/yum/*
之后java 7也成功安装了。
但还是报错:
# cat driver-boot.log /tmp/cosbench/cos/log
Listening on port 0.0.0.0/0.0.0.0:18089 ...
!SESSION 2020-06-03 10:12:59.683 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.7.0_261
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments: -console 18089
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.367
!MESSAGE Bundle plugins/cosbench-castor not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.368
!MESSAGE Bundle plugins/cosbench-log4j not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.368
!MESSAGE Bundle plugins/cosbench-log@6:start not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.369
!MESSAGE Bundle plugins/cosbench-config@6:start not found.
…
…
Github的cosbench的站点里的issue#383里的步骤(具体步骤描述在这篇文章),即删掉cosbench-start.sh里的一行(如下),我也试过了,并没有解决问题。
TOOL_PARAMS="-i 0" -----Delete this line
经过查询,找到了这篇文章,推荐不要使用正式版的0.4.2,推荐试试0.4.2.c4, 于是下载了更早的一个版本0.4.2.c4。
问题解决了,终于成功启动了cosbench driver。
# bash ./start-driver.sh /tmp/cosbench/0.4.2.c4
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 !!!
----------------------------------------------
不知道为什么,在CentOS 7上运行0.4.2 明显的有问题,却还不被修复,结果还要去使用稍早的版本release candidate 4, 这个事儿弄的挺恶心的。
To the English readers:
I document the process and issues here in detail, hope other people hit on the same issue can see it, and save time.
参考资料
================
How to check if port is in use on Linux or Unix
https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/
NETCAT THE MULTI-PURPOSE NETWORKING TOOL
landoflinux.com
Uninstall JDK rpm to reinstall
centos - Uninstall JDK rpm to reinstall - Unix & Linux Stack Exchange
yum-errors
https://wiki.centos.org/yum-errors
CosBench on Red Hat Linux
http://www.vtechdiary.com/2018/09/cosbench-on-red-hat-linux.html
Can't start the system #380
Can't start the system · Issue #380 · intel-cloud/cosbench · GitHub
参考资料
使用COSBench工具對ceph s3接口進行壓力測試--續 - JavaShuo
尝试在CentOS 7上启动cosbench遭遇的一些问题 - 之一 - 中道学友 - 博客园 (cnblogs.com)