COSBench用户指南
COSBench用户指南Version 2.8.5时间:2014年11月作者:Wang, Yaguang本文档介绍如何逐步安装,配置和运行COSBench(云存储基准测试工具),解释如何使用配置文件定义工作负载,并提供参考示例。文档编号: 328791-001US目录文章目录目录@[toc]引言参考硬件配置系统要求支持的云对象存储系统本指南其余部分的内容安装COSBench安装操...
COSBench用户指南
Version 2.8.5
时间:2014年11月
作者:Wang, Yaguang
本文档介绍如何逐步安装,配置和运行COSBench(云存储基准测试工具),解释如何使用配置文件定义工作负载,并提供参考示例。
文档编号: 328791-001US
目录
文章目录
引言
文章目录
COSBench是一个用于测试云对象存储系统的分布式基准测试工具,它目前支持一些云对象存储系统(参见1.3“支持的云对象存储系统”)。
COSBench还允许用户为其他存储系统创建适配器。
有关详细信息,请参阅“COSBench适配器开发指南”。
COSbench包含两个关键组件:
-
Driver(也称为COSBench驱动或负载生成器):
-
负责工作负载生成,向目标云对象存储下发操作,收集性能统计数据。
-
可以通过访问。
-
Controller (也称为COSBench控制器):
-
负责协调drivers集体执行工作负载,收集和汇总来自driver实例的运行时状态或基准测试结果,并接受工作负载提交。
-
可以通过 访问。
-
Controller和Driver可以部署在相同的节点上,也可以部署在不同的节点上,节点可以是物理机或虚拟机(VM)实例。
英特尔COSBench源代码将在Apache
2.0许可下发布,托管地址为http://github.com/intel-cloud/cosbench/。
已在以下位置为COSBench建立了邮件列表:http://cosbench.1094679.n5.nabble.com/。
参考硬件配置
英特尔实验室中用于验证目的的硬件配置如下所示。提供此信息仅供参考,因为适用于各种实现的系统高度依赖于各个使用场景。还要注意,网络资源在COSBench实现中起着至关重要的作用。
硬件 | 配置 |
---|---|
Controller | |
处理器 | 2x Intel® Xeon® processors X5570 @ 2.93 GHz |
内存 | 12 GB |
存储 | 1x 120 GB+ disk drive |
网络 | Intel® 82574 Gigabit Ethernet Controller |
Driver | |
处理器 | 2x Intel Xeon processors X5570 @ 2.93 GHz |
内存 | 12 GB |
存储 | 1x 50 GB+ disk drive |
网络 | Intel® 82599 10 Gigabit Ethernet Controller |
系统要求
*注意:*COSBench的当前版本具有Ubuntu 12.04.1 LTS
桌面版,但COSBench开发团队假定组织将使用各种操作系统进行安装并向社区提供相关反馈.
-
Ubuntu 12.04.1 LTS Desktop
-
Java* Runtime Environment 1.6+
-
Curl 7.22.0+
-
如果需要处理生成的csv文件,则使用Csvtool。
-
空闲的TCP端口(确保这些端口可以非本地访问):
-
COSBench controller机器: 19088
-
COSBench driver 机器: 18088
-
注意: 在整个文档中,命令行以粗体和斜体显示;
黄色文本用于强调,以引起对特定信息的注意。支持的云对象存储系统矩阵。
支持的云对象存储系统
通常,访问每个云对象存储系统将涉及两个部分,它们是认证机制和对象访问语义。
为了满足不同系统的复杂性,COSBench将它们分开处理,并封装到两个API(AuthAPI和StorageAPI)中。
开发人员可以在不同的包中实现它们,或者将它们合并为一个,用户可以将一个Auth
API实现与多个存储API实现相结合,或者将多个Auth API实现与一个存储API实现相关联。
有关详细信息,请参阅“COSBench适配器开发指南”。
下表列出了到目前为止不同的AuthAPI和StorageAPI组合的状态,它可能会不时更新:
注意:
* librados由niklas goerke-niklas974@gitHub贡献,
* sproxyd由Scality的Christophe Vedel贡献
本指南其余部分的内容
本文档介绍如何安装、配置和使用云存储基准工具COSBench。
-
第2节介绍COSBench的初始安装和测试。
-
第3节介绍了如何配置和运行该工具。
-
第4节指导用户如何定义工作负载。
-
第5节解释了COSBench提供的结果以及如何解释它们。
-
第6节回答常见问题。
-
附录A提供了不同存储系统的示例配置。
安装COSBench
安装操作系统
-
按照 Ubuntu installation
guide中的说明进行操作。 -
以下是安装过程中主要步骤的截图,其中包括创建一个名为“cosbench”的用户;
所有其他设置可以保留默认值或由用户自行决定修改。
- 安装后的最终包列表可以在github站点上的文件“pkg.lst”中找到。
安装JRE
-
OpenJDK是默认的JRE; Oracle JRE也应该可行。
-
如果可以联网,则可以通过apt-get安装软件包,如下所示:
cosbench@cosbox:~$ sudo apt-get update
cosbench@cosbox:~$ sudo apt-get install openjdk-7-jre
-
如果不可以联网,可以使用Debian *软件包安装JRE; 两个包是必不可少的:
JRE-LIB 和
JRE-HEADLESS。 -
这些软件包可以按如下方式安装(此过程使用“/tmp”作为示例;用户可以自行决定使用不同的文件夹):
cosbench@cosbox:/tmp$ sudo dpkg –i –force depends
openjdk-7-jre-lib_7u7-2.3.2a-0ubuntu0.12.04.1_all.deb
(Reading database …
cosbench@cosbox:/tmp$ sudo dpkg –i –force depends
openjdk-7-jre-headless_7u7-2.3.2a-0ubuntu0.12.04.1_amd64.deb
Selecting previously unselected package openjdk-7-jre-headless …
cosbench@cosbox:/tmp$ java –showversion
java version “1.7.0_07”
…
安装Curl
- 如果可以联网,可以按如下方式安装Curl:
cosbench@cosbox:~$ sudo apt-get update
cosbench@cosbox:~$ sudo apt-get install curl
- 如果不可以联网,请使用Debian软件包安装Curl:
cosbench@cosbox:/tmp$ sudo dpkg –i curl_7.22.0-3ubuntu4_amd64.deb
cosbench@cosbox:/tmp$ curl –V
curl 7.22.0 (x86_64-pc-linux-gnu) …
安装COSBench
准备
在当前版本中,COSBench
controller和driver是组合在一起的;它们并不各自具有单独的软件包。
从
https://github.com/intel-cloud/cosbench/releases获取安装包**<version>.zip**(例如,2.1.0.GA.zip),并将其放在控制器节点上home目录下的COSBench包中。
安装
按照以下命令完成安装,将COSBench软件包解压缩到一个文件夹中,为其创建一个名为“cos”的符号链接,并使所有bash脚本可执行:
cosbench@cosbox:/tmp$ cd ~
cosbench@cosbox:~$ unzip 2.1.0.GA.zip
cosbench@cosbox:~$ rm cos
cosbench@cosbox:~$ ln –s 2.1.0.GA/ cos
cosbench@cosbox:~$ cd cos
cosbench@cosbox:~$ chmod +x *.sh
目录结构
脚本
脚本 | 描述 |
---|---|
start-all.sh stop-all.sh | 在当前节点上启动/停止controller和driver |
start-controller.sh stop-controller.sh | 仅在当前节点上启动/停止controller |
start-driver.sh stop-driver.sh | 仅在当前节点上启动/停止driver |
cosbench-start.sh cosbench-stop.sh | 上述脚本调用的内部脚本 |
cli.sh | 通过命令行操作工作负载 |
还包括一些Windows *批处理脚本,仅用于演示目的。
脚本 | 描述 |
---|---|
start-all.bat | 在当前节点上启动controller和driver |
start-controller.bat | 仅在当前节点上启动controller |
start-driver.bat | 仅在当前节点上启动driver |
Web.bat | 通过本地安装的浏览器打开controller Web控制台 |
子目录
子目录 | 描述 |
---|---|
archive | 存储所有生成的结果;请参阅本文档的“结果”部分 |
conf | 配置文件,包括COSBench配置和工作负载配置 |
log | 运行时日志文件; 重要的是system.log |
osgi | 包含COSBench库和第三方库 |
main | 包含OSGi启动器 |
验证安装
以下步骤在当前节点上启动controller和driver并进行测试以确保安装正确。
启动COSBench
HTTP代理打破了controller和driver之间的交互。
要避免HTTP请求路由,需要绕过代理设置:
cosbench@cosbox:~$ unset http_proxy
在当前节点上启动COSBench driver和controller。 默认情况下,COSBench
driver侦听端口18088,COSBench controller侦听端口19088。
cosbench@cosbox:~$ sh start-all.sh
检查Controllers and Drivers
cosbench@cosbox:~$ netstat –an |grep LISTEN |grep 19088 #
检查controller.
tcp 0 0 :::19088 ::? LISTEN
Cosbench@cosbox:~$ netstat –an |grep LISTEN |grep 18088 # 检查
driver
tcp 0 0 :::18088 ::? LISTEN
测试安装
Cosbench@cosbox:~$ sh cli.sh submit conf/workload-config.xml # run mock
test.
Accepted with ID: w1
cosbench@cosbox:~$ sh cli.sh info
Drivers:
driver1 http://127.0.0.1:18088/driver
Total: 1 drivers
Active Workloads:
W1 Thu Jul 12 04:37:31 MST 2012 PROCESSING
在浏览器中打开
http://127.0.0.1:19088/controller/index.html以监控状态。在下面的示例中,“活动工作负载”部分中列出了一个“正在处理”的工作负载。
COSBench现在已成功安装在当前节点上。可选地,可以取消工作负载并停止COSBench,如下所示:
cosbench@cosbox:~$ sh cli.sh cancel w1
W1 Thu Jul 12 23:34:14 MST 2012 CANCELLED
cosbench@cosbox:~$ sh stop-all.sh
Stopping cosbench controller …
Successfully stopped cosbench controller.
==================================================
Stopping cosbench driver …
Successfully stopped cosbench driver.
部署COSBench
-
通过scp或共享文件夹等方法将<version> .zip复制到剩余的COSBench节点。
-
重复上面列出的过程以安装COSBench并验证每个节点上的安装。
配置和运行
全局
COSBench
controller和driver依赖于不同的系统配置文件来启动,这些配置文件仅适用于COSBench本身,而不是工作负载配置。
下表概述了COSBench期望的所有配置。
配置 | 描述 | 文件路径 |
---|---|---|
controller | controller的配置; 在初始化期间由controller读取 | conf/controller.conf |
driver | driver的配置; 在初始化期间由driver读取 | conf/driver.conf |
workload | 正在提交的工作负载的配置 | 通过controller的Web界面提交 |
配置Controller
Conf/controller.conf
COSBench controller的配置*需要*INI格式文件,如下例所示:
[controller]
concurrency=1
drivers=3
log_level = INFO
log_file = log/system.log
archive_dir = archive
[driver1]
name=driver1
url=http://192.168.10.1:18088/driver
[driver2]
name=driver2
url=http://192.168.10.2:18088/driver
[driver3]
name=driver3
url=http://192.168.10.3:18088/driver
[controller]
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
drivers | 整型 | 1 | 此controller控制的driver数量 |
concurrency | 整型 | 1 | 可以同时执行的工作负载数量 |
log_level | 字符串 | “INFO” | “TRACE”, “DEBUG”, “INFO”, “WARN”, “ERROR” |
log_file | 字符串 | “log/system.log” | 存储日志文件的位置 |
archive_dir | 字符串 | “archive” | 存储归档工作负载结果的位置 |
第n个driver的driver节应命名为**driver <n>**以便识别。
[driver<n>]
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | 用于标识driver节点的标签。 请注意,driver名称不一定是节点的主机名 | |
url | 字符串 | 访问driver节点的地址 |
配置Driver
Conf/driver.conf
该文件是可选的; 虽然Web控制台无法正确标记driver节点,但COSBench
driver可以在没有此配置文件的情况下启动。 配置是INI格式文件,如以下示例所示::
[driver]
name=driver1
url=http://192.168.0.11:18088/driver
[driver]
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | 用于标识driver节点的标签。 请注意,driver名称不一定是节点的主机名 | |
url | 字符串 | 访问driver节点的地址 |
启动Drivers
-
如果需要,在driver节点上编辑conf / driver.conf。
-
默认情况下,COSBenchdriver侦听端口 18088。
-
在所有driver节点上启动driver。
sh start-driver.sh
-
确保可使用HTTP连接从controller访问所有driver。
-
通过使用Curl连接,控制台中应该有一个有效的HTML文件:
curl
- 在Web浏览器中打开 http://<driver-host>:18088/driver/index.html 时,
将显示以下Web页面:
*注意:*如果出现任何错误或意外结果,请检查系统配置;
常见问题包括防火墙过滤或http代理路由。
启动Controllers
-
在COSBench controller机器上编辑conf/controller.conf。
-
默认情况下,COSBench controller侦听端口 19088.
-
在controller节点上启动Controller。
sh start-controller.sh
-
确保controller已成功启动。
- 通过使用Curl连接,控制台中应该有一个有效的HTML文件:
curl
- 在Web浏览器中打开
时,将显示以下网页(请注意,将以下屏幕截图中显示的<controller-host>
IP地址192.168.250.36 替换为控制器节点的实际IP地址):
提交工作负载
conf/目录中提供了几个模板供参考:
-
workload-config.xml
是一个带有注释的模板,用于描述如何针对不同的存储类型进行配置。
它将访问模拟存储以帮助验证。 -
swift-config-sample.xml 是OpenStack Swift存储系统的模板。
-
ampli-config-sample.xml 是AmpliData AmpliStor
v2.3和v2.5存储系统的模板。有关特定于版本的配置信息,请参阅附录A。 -
s3-config-sample.xml 适用于Amazon S3兼容存储系统的模板。
-
aliyun-config-sample.xml
是Aliyun OSS存储系统的模板。
定义工作负载
有关如何为用户定义的工作负载创建工作负载配置文件的详细信息,请参阅本文档的“工作负载配置”部分。
基本工作负载配置选项也可从controller Web控制台上的工作负载配置页面获得;
请参阅本文档的“工作负载配置”部分以自定义XML文件以获得最大的灵活性。
(请注意,下面屏幕截图中显示的<controller-host>
IP地址192.168.250.36应替换为controller节点的实际IP地址。)
工作负载配置页面支持定义多个相同的阶段,还允许在阶段之间插入延迟以帮助确定边界。
要定义批量工作负载,我们可以在控制器Web控制台上使用“高级配置工作负载”超链接。
高级配置UI有助于自动生成各种输入参数的大量不同组合,例如对象大小,每个容器的对象,容器数量,并发数(works),读-写-删除比率。
单击“工作负载的高级配置”超链接后,将转到高级配置屏幕。从这里,可以生成工作负载文件或直接提交工作负载。
在本节中,我们将研究如何生成工作负载文件。无论在“工作负载矩阵名称”中输入什么值,都将在安装controller的机器上的COSBench安装目录下的“workloads”目录中生成一个具有该名称的目录。
对于在此屏幕中定义的每个工作负载,将创建一个名称等于在“Workload
Name”字段中输入的字符串的文件,并将其放置在上一步创建的工作负载矩阵目录下。可以在“Workload
Matrix Name”和“Workload
Name”字段中输入的名称有一些限制。应该使用字母或数字,允许使用特殊字符包括_ -
#. ( ) / %
&。输入的字符串长度应介于3到50个字符之间。高级配置UI页面上的所有工作负载都将使用身份验证和存储配置。类似的属性,如Runtime,Rampup,Delay和Number
of Drivers将对此网页上定义的所有工作负载通用。定义每个工作负载需要以下输入参数:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
Object sizes | 字符串 | 4,128,512 | 可以用逗号分隔,也可以是一个范围 |
Object size unit | 字符串 | KB | 下拉框由Byte, KB, MB, GB等值组成 |
Objects per container | 字符串 | 1000 | 逗号分隔的字符串 |
Containers | 字符串 | 1,1000 | 逗号分隔的字符串 |
Workers | 字符串 | 1,2,4,8,16,32,64 | 逗号分隔的字符串 |
除了这些参数之外,还可以在“'Add RWD
ratio”按钮的帮助下,根据需要为任何工作负载添加任意数量的读-写-删除组合。
还可以在“Add Workload”按钮的帮助下添加任意数量的工作负载。
完成用适当的值填充所有这些字段后,可以单击“Generate Workload
File/s”按钮。这将在已经提到的位置生成所有配置文件。可以根据需要编辑这些配置文件,然后通过工作负载提交UI屏幕提交它们。我们还可以选择直接通过此页面提交工作负载。我们将在下一个小节中研究这种方法。
提交工作负载
有两种方法可以向COSBench提交工作负载。
- 使用命令行接口:
sh cli.sh submit conf/config.xml
- 使用web 控制台:
在浏览器中打开 以监控运行状态。
(请注意,下面屏幕截图中显示的<controller-host>
IP地址192.168.250.36应替换为控制器节点的实际IP地址。)
检查负载状态
还有两种检查工作负载状态的方法。
- 使用命令行接口:
sh cli.sh info
- 使用Web控制台:
在浏览器中打开 以监控运行状态。
(请注意,下面屏幕截图中显示的<controller-host>
IP地址192.168.250.36应替换为控制器节点的实际IP地址。)
也可以通过高级配置UI页面直接提交工作负载。但是,此页面提交通过此页面本身定义的生成的工作负载。可以使用“Submit
Workload/s”按钮进行同样的操作。要了解如何通过高级配置UI定义工作负载,请参阅上一小节。
单击该界面屏幕的Active Workload部分中的view
details将显示运行时性能数据,如下所示:
停止Drivers和Controllers
ps |grep java # 应该在这里看到java。
sh stop-driver.sh
ps |grep java # 应该没有java运行。
ps |grep java
sh stop-controller.sh
ps |grep java
“ps”命令用于帮助确认driver或controller进程是否已停止。
如果Java进程未按预期停止,则用户可以通过终止进程来强制停止它。
配置Tomcat
COSBench controller和 driver使用Apache
Tomcat作为Web服务器,下表概述了与Tomcat相关的所有配置。
配置 | 描述 | 文件路径 |
---|---|---|
Tomcat for controller | controller上Web服务器的配置 | conf/ controller-tomcat-server.xml |
Tomcat for driver | driver上Web服务器的配置 | conf/ driver-tomcat-server.xml |
Tomcat Web身份验证 | 配置Web身份验证,默认情况下配置了默认的用户名/密码对,用户可以在访问Web控制台时更改配置文件中的“password”以强制进行用户名/密码身份验证。 | conf/cosbench-users.xml |
工作负载管理
COSBench可以接受多个工作负载提交,它为这些工作负载维护一个作业队列,并逐个执行。
在controller Web控制台上,工作负载分为三个部分:
-
Active workloads: 刚刚提交但尚未完成的归置负载,包括处理中的和排队中的。
-
Historical workloads: 这些是已经完成的工作负载。
-
Archived workloads: 这些是在之前的cosbench重启中完成的工作负载。
COSBench可以识别由先前实例生成的工作负载结果,并可以按需加载或卸载它们。
COSBench支持通过以下方法管理这些工作负载:
-
Reorder 活动列表中的工作负载
-
Load/unload 归档的工作负载
-
Re-submit 历史的或归档的工作负载
配置工作负载
引言
workload
auth
storage
workflow
workstage
auth
storage
work
auth
storage
operation
工作负载表示为具有以下结构的XML文件:
-
Workload→ work stage→ work → operation
-
如果需要,一个工作负载可以定义一个或多个work stages。
-
多个work stages的执行是顺序的,而同一work stage的work执行是并行的。
-
对于每一个work,使用“workers”来调整负载。
-
身份验证定义(auth)和存储定义(存储)可以在多个级别定义,而较低级别的定义会覆盖较高级别的定义。
例如,operations在其work中使用auth和storage的定义,以覆盖工作负载级别的定义。
选择表达式(也称为选择器)
概述
- 在工作负载配置中,下面的元素支持一个“config”属性 (auth, storage,
work, operation); 该属性包含一个可选参数列表,其中键值对使用格式“a =
a_val; b = b_val”。.
<work name=“read” workers=“100”
config=“containers=u(1,32);objects=u(1,100)” />
-
在参数列表中,常用的键包括 “containers”, “objects”, 和“sizes”,
它们用于指定如何选择容器,对象和大小。一个表达式用于帮助定义选择。 -
表达式中的数字对于对象大小与对象或容器具有不同的含义。对于对象大小,数字表示数量,而对于对象或容器,数字表示编号或标签。
选择器
表达式 | 格式 | 注释 |
---|---|---|
constant | c(number) | 仅使用指定数字 |
uniform | u(min, max) | 从[min,max]中均匀选择 |
range | r(min,max) | 从[min,max]递增选择 |
sequential | s(min,max) | 从[min,max]递增选择 |
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(1)表示元素数量将固定在一个固定数字中
例如,u(1,100)表示从100个元素中均匀地选择元素编号;
选择是随机的,一些数字可能被选择不止一次,而一些数字可能永远不会被选中
例如,r(1,100)表示元素编号从min到max逐渐增加,每个数字只选择一次;
这通常用于特殊阶段(init, prepare, cleanup,
dispose),如果在正常阶段使用,请确保您了解如何正确使用它(详见FAQ
6.1.17)。
例如,s(1100)表示元素编号从min递增到max,每个数字只选择一次。这是线程安全的。
允许的组合
基于元素类型和work type,选择器还有其他约束; 以下两个表列出了允许的组合。
选择器 v 元素类型:
Key | constant (c(num)) | uniform (u(min,max)) | range (r(min,max)) | sequential (s(min,max)) | histogram (h(min|max|ratio)) |
---|---|---|---|---|---|
containers | ✔ | ✔ | ✔ | ✔ | |
objects | ✔ | ✔ | ✔ | ✔ | |
sizes | ✔ | ✔ | ✔ | ✔ |
选择器v Work 类型:
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() |
工作负载
通用格式
<workload name=”demo” description=”demo benchmark with mock storage” />
属性
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | 工作负载的一个名称 | |
description | 字符串 | 一些附加信息 |
认证
通用格式
<auth type=“none|mock|swauth|keystone”
config="<key>=<value>;<key>=<value>" />
属性
属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
type | 字符串 | none | 认证类型 |
config | 字符串 | 参数列表[可选] |
认证机制
none (不执行任何操作,默认值)
<auth type=“none” config="" />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
Caching | 布尔型 | false | 是否缓存认证信息 |
mock (延迟指定的时间)
<auth type=“mock” config="" />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
token | 字符串 | “token” | Token字符串 |
delay | 长整型 | 20 | 延迟时间(以毫秒为单位) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
swauth (适用于OpenStack Swift)
<auth type=“swauth”
config=“username=test:tester;password=testing;url=http://192.168.250.36:8080/auth/v1.0”
/>
请注意,IP地址192.168.250.36应替换为controller节点的实际IP地址。
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
auth_url | 字符串 | “http:/192.168.250.36:8080/auth/v1.0” | auth节点的URL |
username | 字符串 | 用于认证的用户名。 语法account:user | |
password | 字符串 | 用于认证的密码 | |
timeout | 整型 | 30,000 | 连接超时值(以毫秒为单位) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
keystone (适用于OpenStack Swift)
<auth type=“keystone”
config=“username=tester;password=testing;tenant_name=test;url=http://192.168.250.36:5000/v2.0;service=swift”
/>
请注意,IP地址192.168.250.36应替换为controller节点的实际IP地址。
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
auth_url | 字符串 | “http://192.168.250.36:8080/auth/v2.0” | auth节点的URL |
username | 字符串 | 用于认证的用户名。 语法account:user | |
password | 字符串 | 用于认证的密码 | |
tenant_name | 字符串 | 用户所属的租户名称 | |
service | 字符串 | “swift” | 请求的服务 |
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
httpauth (Http BASIC/DIGEST)
<auth type=“httpauth”
config=“username=test;password=testing;auth_url=http://192.168.250.36:8080/”
/>
请注意,IP地址192.168.250.36应替换为controller节点的实际IP地址。
参数列表
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
auth_url | 字符串 | “http://192.168.250.36:8080/” | auth节点的URL |
username | 字符串 | 用于认证的用户名。 | |
password | 字符串 | 用于认证的密码 | |
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
retry | 整型 | 0 | 指定认证失败时的重试次数 |
存储
通用格式
<storage type=“none|mock|swift|ampli|s3|sproxyd|oss|…”
config="<key>=<value>;<key>=<value>" />
属性
属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
type | 字符串 | “none” | 存储类型 |
config | 字符串 | 参数列表[可选] |
存储系统
none (不执行任何操作,默认值)
<storage type=“none” config="" />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
mock (延迟指定的时间)
<storage type=“mock” config="" />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
logging | 布尔型 | false | 将信息打印到日志 |
size | 整型 | 1024 | 对象大小(字节) |
delay | 整型 | 10 | 延迟时间(毫秒) |
errors | 整型 | 0 | 设置错误限制以模拟失败 |
printing | 布尔型 | False | 是否打印出数据内容 |
Swift (OpenStack Swift)
<storage type=“swift” 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:http://docs.openstack.org/developer/swift/overview_architecture.html. 只有当用户希望利用不同的存储策略而不是默认存储策略时,才需要它。 |
Ampli (Amplidata)
<storage
type="ampli"config=“host=192.168.10.1;port=8080;nsroot=/namespace;policy=14195ca863764fd48c281cb95c9bd555”
/>
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
host | 字符串 | 要连接的controller节点IP | |
port | 整型 | 端口 | |
nsroot | 字符串 | “/namespace” | 命名空间root |
policy | 字符串 | 命名空间将访问的策略ID |
S3 (Amazon S3)
<storage type=“s3” config=“accesskey=<accesskey>;secretkey=<scretkey>;
endpoint=<endpoint>; proxyhost=<proxyhost>;proxyport=<proxyport>” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
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>” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
hosts | 字符串 | 127.0.0.1 | 以逗号分隔的主机名/IP地址列表。 使用简单的循环算法在所有主机上实现请求的负载平衡 |
port | 整型 | 81 | connector使用的端口 |
base_path | 字符串 | /proxy/chord | sproxyd配置文件的路径(此配置文件必须具有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>” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
type | 字符串 | “cdmi” | 选项:“cdmi”或“non-cdmi”,它表示要使用的内容类型,“cdmi”表示存储访问将遵循cdmi内容类型,“non-cdmi”表示存储访问将遵循非cdmi内容类型. |
Customer_headers | 字符串 | 这是一个实验参数,用于查看是否可能支持cdmi衍生物,这可能需要额外的标头。 可以在不通知的情况下移除该参数。 |
Cdmi_swift (SNIA CDMI for swift)
<storage type=“cdmi_swift” config="" />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 30,000 | 连接超时值(毫秒) |
librados (用于Ceph)
<storage type=“librados”
config=“endpoint=<endpoint>;accesskey=<accesskey>;secretkey=<secretkey>”
/>
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
endpoint | 字符串 | 127.0.0.1 | 端点可以是例如监视器节点。 |
accesskey | 字符串 | 用户名如“admin”。 | |
secretkey | 字符串 | secretkey是admin keyring的key。 |
注意:
- 不要使用librados来创建容器(池),它们默认只有64
pgs,这使得它们相当无用,请参阅
http://ceph.com/docs/master/rados/operations/pools/
OSS (Aliyun OSS)
<storage type="oss " config=“accesskey=<Access Key ID>;secretkey=<
Access Key Secret>; endpoint=<endpoint>;
proxyhost=<proxyhost>;proxyport=<proxyport>” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
timeout | 整型 | 50,000 | 连接超时值(毫秒) |
accesskey | 字符串 | 是使用Aliyun API的标识 | |
secretkey | 字符串 | 用于对访问参数进行签名,以防止篡改 | |
endpoint | 字符串 | oss-cn-hangzhou.aliyuncs.com | 端点url(oss存储公开以供外部访问的url )。 |
proxyhost | 字符串 | http代理主机名或IP地址(如果需要)。 | |
proxyport | 整型 | http代理端口(如果需要)。 |
Work Stage
通用格式
<workstage name="<name>" >
</workstage>
属性
属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | 阶段的一个名字 |
Work
通用格式
<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和四种特殊类型的work((init, prepare,
cleanup和dispose)。第4.7节侧重于正常work,而第4.8节涵盖了特殊类型的work。上面给出的表格是一套完整的表格-不同的work类型将有不同的有效表格。一般规则如下:
-
workers 是一个关键属性,通常用于控制负载。
-
runtime*(*包括 ==rampup==和 rampdown), totalOps 和 totalBytes
是控制如何结束工作的属性,称为结束选项。 一个work中只能设置一个。
属性
属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
name | 字符串 | work的一个名称 | |
type | 字符串 | “normal” | work的类型 |
workers | 整型 | 并行进行work的workers数量 | |
interval | 整型 | 5 | 性能快照之间的间隔 |
division | 字符串 | “none” | [“none”| “container”| “object”], 控制workers之间的work分配方式 |
runtime | 整型 | 0 | work将执行多少秒 |
rampup | 整型 | 0 | 加速工作负载的秒数;此时间不包括在runtime中 |
rampdown | 整型 | 0 | 减速工作负载的秒数;此时间不包括在runtime中 |
totalOps | 整型 | 0 | 将执行多少个操作;应该是workers的倍数 |
totalBytes | 整型 | 0 | 要传输多少字节,应该是workers和size的乘积的倍数。 |
driver | 字符串 | 将执行此work的driver,默认情况下,所有driver都将参与执行。 | |
afr | 整型 | 200000 – normal 0 – special work | 可接受的失败率,是百万分之一。 |
特殊 Work
通用格式
<work type=“init|prepare|cleanup|dispose|delay” workers="<number>"
config="<key>=<value>;<key>=<value>" />
特殊work与普通work的不同之处在于:
-
它内部采用并计算“totalOps”,因此配置中==不需要==显式*包含结束选项*。
-
它具有隐式定义的操作,因此*不需要任何operation*。
-
“delay”与其他不同,这会导致work只休眠指定的秒数。
支持的特殊Work
init (批量创建特定==containers== )
<work type=“init” workers=“4” config=“containers=r(1,100)” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如: c(1), r(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
prepare (批量插入指定==objects== )
<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 | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
sizes | 字符串 | 带单位(B/KB/MB/GB)的大小选择表达式;例如: c(128)KB, u(2,10)MB | |
chunked | 布尔型 | False | 是否以chunked模式上传数据 |
content | 字符串 | “random”(default) ”zero” | 使用随机数据或全零填充对象内容 |
createContainer | 布尔型 | False | 创建相关容器(如果不存在) |
hashCheck | 布尔型 | False | 做与对象完整性检查相关的工作 |
cleanup (批量删除指定==objects==)
<work type=“cleanup” workers=“4”
config=“containers=r(1,10);objects=r(1,100)” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
deleteContainer | 布尔型 | False | 删除相关容器(如果存在) |
dispose (批量删除指定==containers==)
<work type=“dispose” workers=“4” config=“containers=r(1,100)” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
delay (插入几秒的延迟)
<workstage name=”delay” closuredelay=”60” >
<work type=“delay” workers=“1” />
</workstage>
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
closuredelay | 整型 | 延迟时间(以秒为单位)。 |
操作
通用格式
<operation type=“read|write|delete” ratio="<1-100>"
config="<key>=<value>;<key>=<value>" />
属性
属性 | 类型 | 默认值 | 注释 |
---|---|---|---|
type | 字符串 | 操作类型 | |
ratio | 整型 | ||
division | 整型 | 该操作的分割策略 | |
config | 字符串 | 参数列表 |
支持的操作
容器/对象命名约定:
-
默认情况下,使用“mycontainers_
<n>”格式命名容器,并使用“myobjects_
<n>”格式命名对象,其中<n>是由参数列表中的一个选择表达式定义的数字。 -
可以通过cprefix/csuffix或oprefix /osuffix修改容器/对象命名。
read
<operation type=“read” ratio=“70” config=“containers=c(1);objects=u(1,100)”
/>
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
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 | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
sizes | 字符串 | 带单位(B/KB/MB/GB)的大小选择表达式;例如: c(128)KB, u(2,10)MB | |
chunked | 布尔型 | False | 是否以chunked模式上传数据 |
content | 字符串 | “random”(default) “zero” | 使用随机数据或全零填充对象内容 |
hashCheck | Boolean | False | 做与对象完整性检查相关的工作 |
filewrite
<operation type=“filewrite” ratio=“20”
config=“containers=c(2);fileselection=s;files=/tmp/testfiles” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
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 | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
list
<operation type=“list” ratio=“10”
config=“containers=c(2);objects=u(1,1000)” />
参数列表:
参数 | 类型 | 默认值 | 注释 |
---|---|---|---|
containers | 字符串 | 容器选择表达式;例如 c(1), u(1,100) | |
cprefix | 字符串 | mycontainers_ | 容器前缀 |
csuffix | 字符串 | <null> | 容器后缀 |
objects | 字符串 | 对象选择表达式;例如 c(1), u(1,100) | |
oprefix | 字符串 | myobjects_ | 对象前缀 |
osuffix | 字符串 | <null> | 对象后缀 |
示例
pure read
e.g: 100% read, 16 users, 300 seconds
<work name=“100r16c300s” workers=“16” runtime=“300”>
<operation type=“read” ratio=“100” config="…" />
</work>
pure write
e.g.: 100% write, 8 clients, 600 seconds
<work name=“100w8c600s” workers=“8” runtime=“600”>
<operation type=“write” ratio=“100” config="…" />
</work>
mixed operations
e.g.: 80% read, 20% write, 32 clients, 300 seconds
<work name=“80r20w32c300s” workers=“32” runtime=“300”>
<operation type=“read” ratio=“80” config="…" />
<operation type=“write” ratio=“20” config="…" />
</work>
附件注释
概要
一些参数需要额外强调才能让用户定义准确的工作负载,本节将介绍它们。
划分策略
划分策略用于将一个work划分为多个不重叠的分区,这些分区具有较小的容器或对象范围,支持的策略有:
container (based), object (based), 或 none。
不同的stage类型有不同的默认划分策略,对于init/dispose,默认为“container”,对于prepare
/cleanup,默认为“object”,对于normal,默认为“none”。
我们将用一个示例来说明不同的划分策略之间的差异,下面是一个work::
<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”,则表示数据范围将按容器分区,访问模式如下所示:
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 |
(注意:如果workers的数量大于containers的数量,则不支持。)
如果“division = object”,则表示数据范围将按对象分区,访问模式如下所示:
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 |
(注意:如果workers的数量大于objects的数量,则不支持。)
如果“division = none”,它用于关闭划分,以便每个worker完全按照work指定的那样 -
没有work的分区,因此每个worker可以触摸所有容器或对象。
结果
所有结果都存储在“archive”目录中。
结构
-
.meta
- 起始运行ID
-
run-history.csv
- 记录所有历史工作负载运行,包括时间和主要阶段
-
workload.csv
- 记录所有历史工作负载运行的总体性能数据
-
子目录
- 以“w <runid> - ”为前缀,为每个工作负载运行存储数据
每个运行数据
以下是每个运行数据列表的示例:
整体性能数据 (即w1-demo.csv)
每个阶段一行:
时间线数据 (即s3-main.csv)
每个阶段一个文件; 可以导入电子表格程序以绘制时间线图表,或使用csvtool处理:
响应时间直方图数据(即w1-demo-rt-histogram.csv)
响应时间的分配是了解服务质量的重要指标; 为此目的生成直方图数据。
数据分组从0到500,000 ms,步进10 ms。
在直方图中,条形表示每个分组中的样本数。
曲线是累积分布函数(CDF),它可以揭示有关主题的见解,例如第90百分位的响应时间。.
响应时间分解 (即s3-main.csv)
除了平均响应时间,平均处理时间也将在数据文件中报告,它将有助于通过时间分解来理解性能瓶颈。
Workload-config.xml
- 此次运行中使用的工作负载配置文件
Workload.log
- 运行时间日志,这有助于进行故障排除
指标
吞吐量 (Operations/s or Op/s)
-
在一秒钟内完成的操作
-
报告的吞吐量是通过将总成功请求除以总运行时间来计算的
响应时间 (ms)
-
操作开始到完成之间的持续时间
-
报告的响应时间是每个成功请求的平均响应时间
-
已经报告了一个额外的处理时间,以帮助分解响应时间。
带宽 (MB/s)
-
每秒传输的总数据(以MB为单位)
-
报告的带宽是通过将传输的总字节除以总运行时间来计算的
-
1 MB = 1000*1000 bytes
成功率 (%)
-
成功操作的比率
-
报告的成功率是通过将成功请求的数量除以请求的总数来计算的
其它指标
-
Op-count: 操作的总数
-
Byte-count: 传输的总数据
常见问题解答
常规
- 监听端口19088/18088是否可配置,如果可以,如何配置?
可以配置; conf /
controller-tomcat-server.xml指定用于controller的端口,driver-tomcat-server.xml指定用于driver的端口。
- “cancelled”和“terminated”的区别是什么?
“Cancelled”表示用户在运行时取消工作负载,而“terminated”表示运行时期间出现错误,这通常需要用户采取措施进行解决。
- 可以提交多个工作负载以便按顺序运行吗?
可以; COSBench可以同时接受多个工作负载并逐个运行。
- 是否可以取消排队的工作负载?
不可以;取消只针对正在运行的工作负载。
- COSBench可以安装在其他Linux*发行版上吗,比如Red Hat Enterprise Linux?
可以,v2.1之前的版本默认支持Red Hat Enterprise Linux 6, v2.1之后的版本采用Ubuntu
12.04.1 LTS作为默认操作系统。
- 是否有可能在不删除或清理旧文件的情况下重用以前测试中的文件?
可以;
init,prepare,cleanup和dispose等特殊阶段都是可选的,即使在main阶段,用户也可以选择适合其测试要求的阶段序列。
要重用数据,用户需要在cleanup和dispose阶段之前填充所有数据并执行所有测试(例如,在序列init,prepare,test1,test2,…
cleanup,dispose中)。 相关的示例工作负载配置文件包含在conf / reusedata.xml中。
- 是否可以定义多个main阶段或其它阶段?
可以; 为避免名称混淆,应使用不同的标签命名。
例如,用户可以定义多个init阶段以创建不同的容器集,或定义多个main阶段以在一个工作负载中执行不同的测试。
- 如果运行的工作负载出现错误,用户可以在哪里查看更多详细信息?
该工作负载的相应文件夹下有一个workload.log(archive\<workload
id>\workload.log); 检查此文件有助于确定错误原因。
- 应该采取什么步骤来解决在init阶段卡住的测试?
使用Curl验证是否可通过HTTP连接访问所有COSBench计算机(“curl http://
<controller-host>:19088 / controller / index.html”或“curl http://
<driver-host>:18088 / driver/index.htm”明明)。
如果防火墙阻止了HTTP连接,则用户必须打开防火墙上的相应端口。
对于controller节点,端口是19088和19089; 对于driver节点,端口为18088和18089。
- 是否有工具将COSBench分发在多个节点上?
尽管COSBench本身不提供用于这种类型的包分发的工具,但有许多外部解决方案用于此目的,例如scp和共享文件夹(samba)。
- 为什么即使workload.log中报告了错误,COSBench仍将工作负载测试显示为“complete”?
尽管normal work的日志中记录了错误,只要特殊work成功完成,
测试可能反映为“complete”状态。
COSBench将“init”、“prepare”、“cleanup”和“dispose”操作视为必须无错误地完成才能引起“completed”状态的特殊work;特殊work中的错误将终止测试。
另一方面,与性能测量相关的normal work可以容忍故障,这些故障由“成功率”跟踪。
- 对于“init”、“prepare”、“cleanup”和“dispose”阶段中的workers数量有什么建议吗?
在“init”和“dispose”阶段执行的工作创建和删除容器。在我们使用Keystone plus
Swift进行的测试中,这些任务可以在大约三分钟内完成,建议每32个容器使用一个worker,每个容器中有100个对象,对象大小为64
KB。通常,容器的数量应该定义为workers数量的倍数。
在“prepare”和“cleanup”阶段执行的工作创建或删除对象,所需的时间取决于对象的数量。通常,对象的数量应该定义为workers数量的倍数。增加workers数量可以加快这一进程。
在“main”中执行的工作确定瓶颈,调优worker参数控制存储系统的负载。workers的数量应该逐渐增加,直到性能下降为止。
- 长时间运行COSBench后如何防止driver出现“OutOfMemory”错误?
可以在“cosbench-start.sh”脚本中指定Java进程的最大堆大小,以防止耗尽内存。
例如,参数“-Xmx2g”会将最大堆大小限制为2 GB。
- 如何将读写拆分到不同的容器中?
用户可以在操作级别分配要访问的容器,将读和写拆分到不同的容器;使用“config”中的“containers”参数可以设置不同的容器范围,如下所示:
<operation type=”read” ratio=”80”
config=”containers=u(1,2);objects=u(1,50)” />
<operation type=”write” ratio=”20”
config=”containers=u(3,4);objects=u(51,100);sizes=c(64)KB” />
conf/splitrw.xml中包含一个示例工作负载配置文件。
- 如何为不同的配置指定不同的容器,例如具有不同对象大小的容器?
用户可以使用“cprefix”参数为不同的配置分配不同的容器集。
例如,用户可以通过使用“cprefix”指定对象大小(例如“64K”)来区分具有不同大小的配置,以避免混淆和意外覆盖,如下所示:
<operation type=”read” ratio=”80”
config=”cprefix=100M_;containers=u(1,32);objects=u(1,50)” />
在这种情况下,容器名称将在目标存储系统中以“100M_”为前缀。 用户可以通过浏览位置
http://<IP of Amplistor controller node>:8080/namespace
来充分利用此功能,如下所示:
- 当工作负载终止时,用户可以从哪里获取日志文件以帮助解决问题?
日志文件位于两个不同的位置:
- **在COSBench安装文件夹中的“log”文件夹中。**此位置的“system.log”文件记录了COSBench系统活动,包括检查工作负载配置文件。如果所需参数丢失或输入错误(例如,“prepare”阶段中的“sizes”),则此文件将包含一个条目:
“driver report error: no such key defined: sizes” ,如下所示:
26_appendix-2.png
- 在COSBench安装文件夹中“archive”文件夹中的“workload”文件夹中。
此位置中的“workload.log”文件记录了工作负载运行时活动。
如果在工作负载运行时发生失败操作,则会在此文件中记录错误(通常与HTTP相关)。
- 可以在normal阶段使用range选择器吗,怎么做?
可以,range选择器可以在normal阶段使用,但它是不鼓励的,因为它将涉及一些微妙的约束。首先,当枚举所有元素时,range选择器通常需要结合“totalOps”来终止执行。其次,容器的计数应该是对象计数的相对素数,否则,实际访问范围只是两个计数中最大的命令除数之一。例如,对于下面的配置,期望创建1600个唯一对象,但实际上,它只创建800(=32*50/2)个唯一对象。
<work name=“main” workers=“8” totalOps=“1600”>
<operation type=“read” ratio=“100”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
- 可以在同一个节点上运行多个driver吗,怎么做?
可以,COSBench没有限制在同一个节点上可以运行多少driver,但是由于默认情况下driver将监听端口18088,为了避免端口冲突,用户需要将不同的driver进程设置为不同的监听端口。
要更改监听端口,用户需要编辑conf/driver-tomcat-server.xml,并将下面的“port”值更改为不同driver的可分辨编号
<Connector port=“18088” protocol=“HTTP/1.1” />
- 是否有任何方法从COSBench方面识别哪个对象被创建失败 ?
有,可以打印出对象名称,但需要更改COSBench
driver进程的日志记录级别。一般步骤如下:
- 在每个driver节点上,在conf/文件夹中创建一个driver.conf文件,如果不存在,则使用以下行:
[driver]
Log_level = DEBUG
- 重启所有driver进程
Swift
- 如何避免与大对象大小(例如1 GB)相关的长准备时间?
大量大对象可能会使网络带宽饱和,从而导致性能降低。
如果网络带宽未饱和,则可以增加“workers”参数,以更好地利用带宽。
- 对于大对象大小(例如1 GB)进行操作是否有任何特殊更改?
有; 要使用大对象大小进行测试,请考虑以下事项:
-
较长的加速时间(使用参数“rampup”指定)可以帮助提高性能,而较长的运行时间(使用参数“runtime”指定)可以帮助提高结果的一致性。
这些参数的最佳设置组合取决于个人使用情况。
要帮助确定适当的设置,请运行测试用例,将运行时间设置为长时间运行(例如30分钟),而不设置“rampup”参数。
查询生成的时间轴曲线,确定在这种情况下需要多少秒才能增加;
然后可以将“runtime”参数设置为“rampup”值的10倍。 -
随着每个操作完成的时间增加,更有可能发生超时错误;
可以使用“config”中的“timeout”参数来缓解此影响,该参数使用毫秒作为单位。
对于Swift,典型语法如下:
<storage type=“swift” config=“timeout=100000” />
- 用户还应在COSBench本身范围之外验证被测系统的正确设置;
例如,由于后端存储设置不当,可能会出现错误或性能不足。
- 当使用Keystone配置大量workers(例如1024),为成功完成测试,如何克服认证阶段工作负载的终止?
为工作负载配置文件中的“auth”部分引入了新参数“retry”,以帮助克服认证阶段的故障。
以下是示例配置:
<auth type=“keystone”
config=“username=operator;password=intel2012;tenant_name=cosbench;auth_url=http://10.10.9.100:5000/v2.0;service=swift; retry=10”/>
-
如何用tempauth测试?
Tempauth实际上遵循与swauth相同的过程,因此只需对tempauth使用swauth认证机制。
-
是否支持存储策略,如何使其正常工作?
支持,从v0.4.0.0版本开始支持存储策略(http://docs.openstack.org/developer/swift/overview_architecture.html)
。支持涉及一个新的“policy”参数,如下所示:
<storage type=“swift” config="policy=gold " />
此处的“gold”可以替换为用户在“/etc/swift/swift.conf”中定义的任何策略名称,如:
[storage-policy:0]
name = gold
default = yes
[storage-policy:1]
name = silver
在本例中,策略名称可以是“gold”或“silver”,这将在COSBench工作负载配置文件中使用。
对于那些不关心存储策略的人,只需删除swift工作负载配置文件中的“policy”参数。
AmpliStor
- 系统从哪里获得.xml文件中策略的字符串?
用户可以访问Amplidata控制器节点并通过浏览位置http://<IP of Amplistor
controller node>:8080/manage/policy 来管理可用策略,如下所示:
- 对象范围如何影响性能?
扩展对象范围可以通过减少写入冲突来提高写入性能。
例如,将“u(1,100)”更改为“u(1,10000)”会将对象范围从100个对象扩展到10,000个对象。
- 如何简化策略UID设置?
只有“init”阶段需要策略UID;
其他阶段(如prepare,main,cleanup和dispose)不需要设置策略UID。
如果工作负载中没有“init”阶段,则不需要策略UID。
- 如何在不同阶段使用“nsroot”参数?
引入“nsroot”参数是为了支持AmpliStor
v2.5和Plus,其中访问命名空间需要与对象分开的根路径。因此,只有涉及名称空间访问的工作(如init/dispose阶段)才需要此参数。对于prepare,main,cleanup等其它阶段,有两个选项,一个是只删除“nsroot”参数,另一个是将“nsroot”设置为“/namespace”
而不是 “/manage/namespace”。
如果在main阶段设置“nsroot=/manage/namespace”,通常会出现一些类似的异常,如下图所示:
2013-11-20 10:45:33,764 [ERROR] [Writer] - fail to perform write operation
com.intel.cosbench.api.storage.StorageException:
org.apache.http.client.ClientProtocolException
…
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot
retry request with a non-repeatable request entity. The cause lists the
reason the original request failed.
…
Caused by: java.net.SocketException: Broken pipe
…
S3
- 参数“proxyhost”和“proxyport”的用法是什么?
在某些情况下(例如在企业网络中),用户需要通过一个http代理才能访问Amazon
S3服务,“proxyhost”和“proxyport”用于配置http代理设置。
- 可以将请求路由到Amazon S3中的指定region吗?
S3适配器支持一个名为“endpoint”的参数,该参数能够支持到不同区域的路由请求。
例如,设置
“==**endpoint=https://s3-us-west-1.amazonaws.com**==”
将在俄勒冈州地区创建桶。有关详细的s3 region,请访问:
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
Ceph
- 支持哪些方法来访问Ceph对象存储?
COSBench支持通过Rados网关访问Ceph对象存储,在这种情况下,公开的访问协议可以是S3或Swift,这取决于Rados网关配置。从用户的角度来看,Ceph集群是S3或Swift兼容的对象存储,工作负载配置遵循S3或Swift的配置规则。
此外,COSBench还可以通过librados通过Rados协议与Ceph对象存储交互。在这种情况下,存储适配器应该是“librados”。一个警告是ceph
librados包应该安装在COSBench driver节点上。
CDMI
- 如何通过cdmi协议测试swift ?
存储类型“cdmi_swift”用于swift,一个示例工作负载文件conf/cdmi-swift-config-sample.xml可以帮助参考。
- 为什么使用两种不同的cdmi存储类型?
COSBench包括两个与cdmi相关的适配器:cdmi和cdmi-swift,主要区别在于认证。
CDMI标准采用HTTP标准认证机制,而swift使用基于令牌的认证。
CDMI是一种通用协议,可以帮助在一个标准中容纳不同的配置文件,它可以用于扩展,并且可以看到更多cdmi风格的适配器。
附录A. 示例配置
Swift
示例工作负载配置描述了以下测试场景:
-
测试包括五个阶段: init, prepare, main, cleanup和dispose。
-
测试创建32个容器,每个容器包含50个大小为64 KB的对象。.
-
操作请求被发送到三个controller节点。
-
这些请求包括80%的GET(读)操作和20%的PUT(写)操作;
读取操作从#1到#50的50个对象中随机请求一个对象,而写入操作随机创建对象编号从#51到#100的对象。 -
完成后,测试将清理所有对象并销毁所有容器。
要使用keystone认证,请使用注释的keystone认证行作为示例(请注意,IP地址192.168.250.36应替换为controller节点的实际IP地址)。
<?xml version=“1.0” encoding=“UTF-8” ?>
<workload name=“swift-sample” description=“sample benchmark for swift”>
<storage type=“swift” />
<!-- MODIFY ME -->
<auth type=“swauth”
config=“username=test:tester;password=testing;auth_url=http://192.168.10.1:8080/auth/v1.0”
/>
<!-- Keystone Authentication
<auth type=“keystone”
config=“username=tester;password=testing;tenant_name=test;auth_url=http://192.168.250.36:5000/v2.0;service=swift”
/>
–>
<workflow>
<workstage name=“init”>
<work type=“init” workers=“1” config=“containers=r(1,32)” />
</workstage>
<workstage name=“prepare”>
<work type=“prepare” workers=“1”
config=“containers=r(1,32);objects=r(1,50);sizes=c(64)KB” />
</workstage>
<workstage name=“main”>
<work name=“main” workers=“8” rampup=“100” runtime=“300”>
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
</workstage>
<workstage name=“cleanup”>
<work type=“cleanup” workers=“1” config=“containers=r(1,32);objects=r(1,100)”
/>
</workstage>
<workstage name=“dispose”>
<work type=“dispose” workers=“1” config=“containers=r(1,32)” />
</workstage>
</workflow>
</workload>
AmpliStor
工作负载配置描述了以下测试场景:
-
测试包括五个阶段: init, prepare, main, cleanup和dispose。
-
该测试创建了32个容器(名称空间),每个容器包含50个大小为64 KB的对象。
-
操作请求被发送给三个controller节点,每个controller节点承载两个客户端守护进程。
-
请求包括80%的GET(读)操作和20%的PUT(写)操作;读操作随机地从编号为#1到#50的50个对象中请求对象,而写操作随机地创建编号为#51到#100的对象。
-
完成后,测试将清理所有对象并销毁所有容器 (namespaces)。
对于AmpliStor v2.5版本,所有与命名空间相关的work (init/dispose)
都需要“nsroot=/manage/namespace” , 对于v2.5之前的版本,只需删除“nsroot = /
manage / namespace”片段下面的内容。
<?xml version=“1.0” encoding=“UTF-8” ?>
<workload name=“ampli-sample” description=“sample benchmark for amplistor”>
<storage type=“ampli”
config=“host=192.168.10.1;port=8080;policy=14195ca863764fd48c281cb95c9bd555” />
<workflow>
<workstage name=“init”>
<storage type=“ampli”
config=“host=192.168.10.1;port=8080;nsroot=/manage/namespace;policy=14195ca863764fd48c281cb95c9bd555”
/>
<work type=“init” workers=“1” config=“containers=r(1,32)” />
</workstage>
<workstage name=“prepare”>
<work type=“prepare” workers=“1”
config=“containers=r(1,32);objects=r(1,50);sizes=c(64)KB” />
</workstage>
<workstage name=“main”>
<work name=“c1p0” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.1;port=8080” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c1p1” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.1;port=8081” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c2p0” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.2;port=8080” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c2p1” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.2;port=8081” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c3p0” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.3;port=8080” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c3p1” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.3;port=8081” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
</workstage>
<workstage name=“cleanup”>
<work type=“cleanup” workers=“1” config=“containers=r(1,32);objects=r(1,100)”
/>
</workstage>
<workstage name=“dispose”>
<storage type=“ampli”
config=“host=192.168.10.1;port=8080;nsroot=/manage/namespace” />
<work type=“dispose” workers=“1” config=“containers=r(1,32)” />
</workstage>
</workflow>
</workload>
如本指南开头所述,COSBench还允许用户为其它存储系统创建适配器。
有关详细信息,请参阅“COSBench适配器开发指南”。.
ion type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c2p0” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.2;port=8080” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c2p1” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.2;port=8081” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c3p0” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.3;port=8080” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
<work name=“c3p1” workers=“16” rampup=“100” runtime=“300”>
<storage type=“ampli” config=“host=192.168.10.3;port=8081” />
<operation type=“read” ratio=“80” config=“containers=u(1,32);objects=u(1,50)”
/>
<operation type=“write” ratio=“20”
config=“containers=u(1,32);objects=u(51,100);sizes=c(64)KB” />
</work>
</workstage>
<workstage name=“cleanup”>
<work type=“cleanup” workers=“1” config=“containers=r(1,32);objects=r(1,100)”
/>
</workstage>
<workstage name=“dispose”>
<storage type=“ampli”
config=“host=192.168.10.1;port=8080;nsroot=/manage/namespace” />
<work type=“dispose” workers=“1” config=“containers=r(1,32)” />
</workstage>
</workflow>
</workload>
如本指南开头所述,COSBench还允许用户为其它存储系统创建适配器。
有关详细信息,请参阅“COSBench适配器开发指南”。.
更多推荐
所有评论(0)