【存儲測試】cosbench存儲性能測試工具


一、前言

參考資料:
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角色需要使用到1808918088端口
    controller角色需要使用到1908919088端口

#開放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,可選值為TRACEDEBUGINFOWARNERROR,表示日志打印等級
    • log_file
      默認值為log/system.log,表示日志文件存放位置
    • archive_dir
      默認值為archive,表示工作負載結果存放位置,當參數值為archive,則工作負載結果存放於0.4.2/archive目錄內
  • [driverx]
    當有多個driver時,第{n}個driver命名為[driver{n}]

    • name
      用於標識driver節點的標簽,名稱可以自定義
    • url
      訪問driver節點的地址

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節點的地址

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 workloadsurl,提交測試文件即可

4、分析結果

  • 使用命令行接口
    在controller節點cosbench目錄下,使用sh cli.sh info命令查看當前運行任務

  • 使用web控制台
    web訪問控制台地址http://{controller-ip}:19088/controller,點擊對應任務view detailsurl,查看當前運行狀態及結果

四、選擇表達式

1、概述

在測試參數文件中,authstoragestoragework定義中支持config屬性配置,該屬性包含一個可選的參數列表(使用鍵值對格式表示,如"a=a_val;b=b_val")

  • 在參數列表中,常用的鍵包括containersobjectssizes,用來指定如何選擇容器、對象、大小

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認證機制有nonemockswauthkeystonehttpauth

  • 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(initpreparecleanupdispose),上面示例參數針對所有組合情況,不同工作類型會有不同的參數組合,一般規則如下:

  1. 通常使用workers控制負載情況
  2. 通常使用runtime(包括rampuprampdown)、totalOpstotalBytes控制負載什么時候結束,一般一個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類型)
可接受的失敗率,是百萬分之一。

參數解釋

  1. division(划分策略)
    1.1. division用於將一個work划分為多個不重疊區域,這些區域有着較小的容器或者對象范圍,支持的策略有nonecontainerobject
    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有以下不同的地方:

  1. 它內部采用totalOps並計算具體數值來控制負載運行時長,因此不需要額外去定義結束選項
  2. 它有隱形定義的操作,因此不需要額外再定義具體操作內容(operation
  3. "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
    操作類型,常用操作類型有readwritefilewritedelete,具體詳見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

  1. cosbench高並發時,會出現上傳、刪除文件不完全的情況,若讀取未上傳完全的數據,則會出現Terminate錯誤
    如讀取模型測試中斷,則使用以下命令查看,檢查各個bucket對象個數與測試模型預定數據規模一致
radosgw-admin bucket stats --bucket={bucket-name} | grep num_objects

注:一般測試讀模型時,需要預填准備測試數據,此時上傳對象需要使用s(min,max)表達式順序執行,從而保證讀取的對象數據完全

八、使用建議

注:此處引用文章**COSBench測Ceph對象存儲:那些網上找不到的細節**

1、cosbench部署建議

  1. 根據實際情況決定客戶端數量,以能壓滿帶寬為准;
  2. 運行COSBench的節點需要萬兆網或更大帶寬。為測試出性能瓶頸,客戶端出口應大於或等於集群入口;
  3. 運行COSBench的節點為專用集群外測試節點或至少是業務網與存儲網分離的純OSD節點(沒有其它任何服務);

2、測試用例設計建議

  1. 進行預測試,對各規模用例在集群中的表現進行預估,為正式測試用例和壓力測試用例的設計與選取作參考;
  2. 並發數的選取,應以能夠執行完成為准。其標准是,大規模文件數量的上傳測試能夠上傳完全;
  3. 文件大小的選取,如無特殊要求,下限為分片后大於磁盤條帶寬度,上限為大於rgw分片大小一倍,並應考慮橫向對比需要;
  4. 文件數的選取,應以用例執行時間為准,以單個用例執行時間在30分鍾至90分鍾為佳。選取標准參考預測試的結果;
  5. 調優用例設計應選取低並發用例,不能觸及帶寬與磁盤I/O等物理瓶頸。
  6. 一組同時測寫讀刪時Workload各使用一個桶進行操作,分離任務;

3、用例執行建議

  1. 執行前務必確認桶存在;
  2. 對於所有測試用例,建議先依次執行全部寫用例,清緩存后再依次執行全部讀用例,再依次刪除;
  3. 將大規模用例拆分成多個相同的小用例,確保單個桶內的對象不會太多,上限可定為1千萬;
  4. 寫完成后,務必使用radosgw-admin bucket stats –bucket={bucket-name}查看桶內對象數是否達到指定用例規模;
  5. 讀之前,應手動清除內存緩存;
  6. 用例執行過程中,應不時監看用例執行情況,若發現性能表現異常,應及時進行調整並重新提交執行測試用例;
  7. 刪除完成后,務必查看桶內對象數,以確認刪除干凈;

4、結果分析建議

  1. 確認結果的合理性:執行時間過短不可用(數據不准),數據異常不可用(計算錯誤),運行時間不成比例不可用(說明有性能顯著升降),上傳不完全不可用(導致結果異常);
  2. 帶寬需要手動計算,提取COSBench中的原始網速數據(以字節為單位)進行手工換算即可;
  3. 在混合操作測試中,操作數不會嚴格按照比例分布,但不影響性能結果;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM