一、前言
參考資料:
https://blog.csdn.net/QTM_Gitee/article/details/100067724
https://github.com/intel-cloud/cosbench/blob/master/COSBenchUserGuide.pdf
COSBench測Ceph對象存儲:那些網上找不到的細節
1、介紹
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
對象存儲
2、組件
cosbench可以聯機測試,主要有以下兩個關鍵組件:
-
driver
cosbench負載生成器,主要負責工作負載生成,發布針對雲對象存儲的操作和收集性能統計信息
可以通過http://{driver-ip}:18088/driver
地址訪問 -
controller
cosbench控制器,主要負責協調負載生成器共同執行工作負載,收集來自負載生成器的基准性能測試結果
可以通過http://{controller-ip}:19088/controller
地址訪問
注:controller和driver角色可以部署在同一個節點上
二、安裝部署
1、軟件包安裝
1.1、部署jre環境
下載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/profile
1.2、安裝nmap-ncat
controller和driver之間通信需要依賴nc環境
執行 yum install -y nmap-ncat
命令在線安裝ncat包
1.3、安裝curl
通常情況下,系統默認已經安裝curl包
如系統未安裝,可通過yum install curl -y
命令在線安裝
1.4、部署cosbench環境
官方提供的最新版本
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
2、其他調整
2.1、關閉防火牆
使用過程中需要關閉防火牆
或者開放指定端口
,通過以下任意一種方法均可以
-
關閉防火牆
執行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
2.2、關閉MD5校驗功能
參考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 |
1、參數配置
controller和driver依賴不同系統配置來啟動服務,在啟動controller和driver服務時,需要先行定義角色配置
1.1、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
目錄內
- concurrency
-
[driverx]
當有多個driver時,第{n}個driver命名為[driver{n}]
- name
用於標識driver節點的標簽,名稱可以自定義 - url
訪問driver節點的地址
- name
1.2、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節點的地址
- name
2、服務啟動
2.1、controller啟動
在controller角色節點執行以下命令啟動controller
[root@node241 0.4.2.c4]# sh start-controller.sh
#檢查controller服務啟動情況
[root@node241 0.4.2.c4]# lsof -i:19088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 30012 root 88u IPv6 184509 0t0 TCP *:19088 (LISTEN)
[root@node241 0.4.2.c4]# ps -aux | grep 30012
root 30012 0.6 4.2 4585852 165528 pts/0 Sl 15:51 0:06 java -Dcosbench.tomcat.config=conf/controller-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.controller -console 19089
注:若節點需要同時啟動controller和driver角色,也可以使用sh start-all.sh
命令啟動(start-all.sh
=start-driver.sh
+start-controller.sh
)
2.2、driver啟動
在所有driver角色節點執行以下命令啟動driver
[root@node242 0.4.2.c4]# sh start-driver.sh
#檢查driver服務啟動情況
[root@node242 0.4.2.c4]# lsof -i:18088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23102 root 100u IPv6 161668 0t0 TCP *:18088 (LISTEN)
[root@node242 0.4.2.c4]# ps -aux | grep 23102
root 23102 0.2 5.2 4597000 203344 pts/0 Sl 15:12 0:07 java -Dcosbench.tomcat.config=conf/driver-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.driver -console 18089
3、提交測試
可以使用以下兩種方法提交測試(示例測試參數文件為config.xml)
- 使用命令行接口
在controller節點cosbench目錄下,使用sh cli.sh submit {test.xml}
命令提交測試
[root@node241 0.4.2.c4]# sh cli.sh submit conf/config.xml
- 使用web控制台
web訪問控制台地址http://{controller-ip}:19088/controller
,點擊submit new workloads
url,提交測試文件即可
4、分析結果
-
使用命令行接口
在controller節點cosbench目錄下,使用sh cli.sh info
命令查看當前運行任務 -
使用web控制台
web訪問控制台地址http://{controller-ip}:19088/controller
,點擊對應任務view details
url,查看當前運行狀態及結果
四、選擇表達式
1、概述
在測試參數文件中,auth
、storage
、storage
、work
定義中支持config
屬性配置,該屬性包含一個可選的參數列表(使用鍵值對格式表示,如"a=a_val;b=b_val")
- 在參數列表中,常用的鍵包括containers、objects、sizes,用來指定如何選擇容器、對象、大小
2、選擇器
表達式 | 格式 | 注釋 |
---|---|---|
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)
3、參數組合
基於元素類型和工作類型的選擇器有額外的約束,下面兩個表列出了允許的組合
- 元素類型選擇器
Key | constant (c(num)) | uniform (u(min,max)) | range (r(min,max)) | sequential (s(min,max)) | histogram(h(min|max|ratio)) |
---|---|---|---|---|---|
containers | ✔ | ✔ | ✔ | ✔ | |
objects | ✔ | ✔ | ✔ | ✔ | |
sizes | ✔ | ✔ | ✔ | ✔ |
- 工作類型選擇器
Key | init | prepare | normal (read) | normal (write) | normal (delete) | cleanup | dispose |
---|---|---|---|---|---|---|---|
containers | r(), s() | r(), s() | c(), u(), r(), s() | c(), u(), r(), s() | c(), u(), r(), s() | r(), s() | r(), s() |
objects | r(), s() | c(), u(), r(), s() | c(), u(), r() | c(), u(), r(), s() | r(), s() | ||
sizes | c(), u(), h() | c(), u(), h() |
五、負載配置詳解
本小節主要介紹工作負載參數定義,通常為標簽對目錄結構的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>
workload定義(工作負載)
<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3-sample" description="sample benchmark for s3">
</workload>
- name:工作負載名稱定義
- description:工作負載一些相關描述
1、auth定義(認證機制)
cosbench認證機制有none
、mock
、swauth
、keystone
、httpauth
- none (do nothing, default)
默認值,不進行任何操作
<auth type="none" config="" />
config
參數列表如下:
參數 | 類型 | 默認值 | 注釋 |
---|---|---|---|
logging | 布爾型 | false | 將信息打印到日志 |
retry | 整型 | 0 | 指定認證失敗時的重試次數 |
Caching | 布爾型 | false | 是否緩存認證信息 |
參數 | 類型 | 默認值 | 注釋 |
--- | --- | --- | --- |
type | 字符串 | “cdmi” | 選項:“cdmi”或“non-cdmi”,它表示要使用的內容類型,“cdmi”表示存儲訪問將遵循cdmi內容類型,“non-cdmi”表示存儲訪問將遵循非cdmi內容類型. |
Customer_headers | 字符串 | 這是一個實驗參數,用於查看是否可能支持cdmi衍生物,這可能需要額外的標頭。 可以在不通知的情況下移除該參數。 |
- mock (delay specified time)
延遲指定時間
<auth type="mock" config="" />
config
參數列表如下:
參數 | 類型 | 默認值 | 注釋 |
---|---|---|---|
token | 字符串 | “token” | Token字符串 |
delay | 長整型 | 20 | 延遲時間(以毫秒為單位) |
retry | 整型 | 0 | 指定認證失敗時的重試次數 |
- swauth (for OpenStack Swift)
適用於OpenStack Swift
<auth type="swauth" config="username={username};password={password};url=http://{controller-ip}:8080/auth/v1.0 />"
config
參數列表如下:
參數 | 類型 | 默認值 | 注釋 |
---|---|---|---|
url | 字符串 | http:/{controller-ip}:8080/auth/v1.0 | auth節點的URL,一般為controller節點 |
username | 字符串 | 用於認證的用戶名,語法account:user | |
password | 字符串 | 用於認證的密碼 | |
timeout | 整型 | 30,000 | 連接超時值(以毫秒為單位) |
retry | 整型 | 0 | 指定認證失敗時的重試次數 |
- keystone (for OpenStack Swift)
適用於OpenStack Swift
<auth type="keystone" config="username={username};password={password};tenant_name={tenant_name};url=http://{controller-ip}:8080/v2.0;service=swift"/>
config
參數列表如下:
參數 | 類型 | 默認值 | 注釋 |
---|---|---|---|
url | 字符串 | http://{controller-ip}:8080/auth/v2.0 | auth節點的URL |
username | 字符串 | 用於認證的用戶名。 語法account:user | |
password | 字符串 | 用於認證的密碼 | |
tenant_name | 字符串 | 用戶所屬的租戶名稱 | |
service | 字符串 | swift | 請求的服務 |
timeout | 整型 | 30,000 | 連接超時值(毫秒) |
retry | 整型 | 0 | 指定認證失敗時的重試次數 |
- httpauth (Http BASIC/DIGEST)
<auth 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 | 指定認證失敗時的重試次數 |
2、storage定義(存儲系統)
- none (do nothing, default)
默認值,不進行任何操作
<storage type="none" config="" />
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節點IP | |
port | 整型 | 端口 | |
nsroot | 字符串 | “/namespace” | 命名空間root |
policy | 字符串 | 命名空間將訪問的策略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 | 整型 | 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>" />
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。 |
3、workstage定義(工作階段)
<workstage name="<name>" >
</workstage>
- name:階段的一個名字
4、work定義
4.1、通用格式
<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類型) |
可接受的失敗率,是百萬分之一。 |
參數解釋
- 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
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 |
4.2、特殊work
4.2.1、通用格式
<work type="init|prepare|cleanup|dispose|delay" workers="{number}"
config="{key}={value};{key}={value}" />
特殊work與常規work有以下不同的地方:
- 它內部采用
totalOps
並計算具體數值來控制負載運行時長,因此不需要額外去定義結束選項 - 它有隱形定義的操作,因此不需要額外再定義具體操作內容(
operation
) - "delay"與其他不同,這會導致work只休眠指定的秒數
4.2.2、支持的特殊work
- init(批量創建特定桶)
<work type="init" workers="4" config="containers=r(1,100)" />
參數列表如下:
參數 | 類型 | 默認值 | 注釋 |
---|---|---|---|
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)MB | |
chunked | 布爾型 | False | 是否以chunked模式上傳數據 |
content | 字符串 | random | 使用隨機數據或全零填充對象內容,可選參數為random、zero |
createContainer | 布爾型 | 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
即延遲時間(單位為秒)
5、operation定義
注: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)MB | |
chunked | 布爾型 | False | 是否以chunked模式上傳數據 |
content | 字符串 | random | 使用隨機數據或全零填充對象內容,可選參數為random、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 | 字符串 |
|
容器后綴 |
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、測試總結
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個
2、測試模型
序號 | 客戶端個數 | 客戶端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 |
2.1、單客戶端4K讀寫測試
單個客戶端,單個客戶端線程數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>
2.2、多客戶端4K讀寫測試
三個客戶端,單個客戶端線程數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>
2.3、單客戶端4M讀寫測試
一個客戶端,單個客戶端線程數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>
2.4、多客戶端4M讀寫測試
三個客戶端,單個客戶端線程數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>
3、Q&A
- cosbench高並發時,會出現上傳、刪除文件不完全的情況,若讀取未上傳完全的數據,則會出現
Terminate
錯誤
如讀取模型測試中斷,則使用以下命令查看,檢查各個bucket對象個數與測試模型預定數據規模一致
radosgw-admin bucket stats --bucket={bucket-name} | grep num_objects
注:一般測試讀模型時,需要預填准備測試數據,此時上傳對象需要使用
s(min,max)
表達式順序執行,從而保證讀取的對象數據完全
八、使用建議
注:此處引用文章
**COSBench測Ceph對象存儲:那些網上找不到的細節**
1、cosbench部署建議
- 根據實際情況決定客戶端數量,以能壓滿帶寬為准;
- 運行COSBench的節點需要萬兆網或更大帶寬。為測試出性能瓶頸,客戶端出口應大於或等於集群入口;
- 運行COSBench的節點為專用集群外測試節點或至少是業務網與存儲網分離的純OSD節點(沒有其它任何服務);
2、測試用例設計建議
- 進行預測試,對各規模用例在集群中的表現進行預估,為正式測試用例和壓力測試用例的設計與選取作參考;
- 並發數的選取,應以能夠執行完成為准。其標准是,大規模文件數量的上傳測試能夠上傳完全;
- 文件大小的選取,如無特殊要求,下限為分片后大於磁盤條帶寬度,上限為大於rgw分片大小一倍,並應考慮橫向對比需要;
- 文件數的選取,應以用例執行時間為准,以單個用例執行時間在30分鍾至90分鍾為佳。選取標准參考預測試的結果;
- 調優用例設計應選取低並發用例,不能觸及帶寬與磁盤I/O等物理瓶頸。
- 一組同時測寫讀刪時Workload各使用一個桶進行操作,分離任務;
3、用例執行建議
- 執行前務必確認桶存在;
- 對於所有測試用例,建議先依次執行全部寫用例,清緩存后再依次執行全部讀用例,再依次刪除;
- 將大規模用例拆分成多個相同的小用例,確保單個桶內的對象不會太多,上限可定為1千萬;
- 寫完成后,務必使用
radosgw-admin bucket stats –bucket={bucket-name}
查看桶內對象數是否達到指定用例規模; - 讀之前,應手動清除內存緩存;
- 用例執行過程中,應不時監看用例執行情況,若發現性能表現異常,應及時進行調整並重新提交執行測試用例;
- 刪除完成后,務必查看桶內對象數,以確認刪除干凈;
4、結果分析建議
- 確認結果的合理性:執行時間過短不可用(數據不准),數據異常不可用(計算錯誤),運行時間不成比例不可用(說明有性能顯著升降),上傳不完全不可用(導致結果異常);
- 帶寬需要手動計算,提取COSBench中的原始網速數據(以字節為單位)進行手工換算即可;
- 在混合操作測試中,操作數不會嚴格按照比例分布,但不影響性能結果;