cosbench配置說明

1、前言

參考資料:
https://blog.csdn.net/QTM_Gitee/article/details/100067724
https://github.com/intel-cloud/cosbench/blob/master/COSBenchUserGuide.pdf
COSBench測Ceph對象存儲:那些網上找不到的細節html

一、介紹

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對象存儲java

二、組件

cosbench能夠聯機測試,主要有如下兩個關鍵組件:node

  • driver
    cosbench負載生成器,主要負責工做負載生成,發佈針對雲對象存儲的操做和收集性能統計信息
    能夠經過http://{driver-ip}:18088/driver地址訪問linux

  • controller
    cosbench控制器,主要負責協調負載生成器共同執行工做負載,收集來自負載生成器的基準性能測試結果
    能夠經過http://{controller-ip}:19088/controller地址訪問
    注:controller和driver角色能夠部署在同一個節點上git

2、安裝部署

一、軟件包安裝

1.一、部署jre環境

下載jre版本包,解壓縮至/opt目錄下github

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環境變量web

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.二、安裝nmap-ncat

controller和driver之間通訊須要依賴nc環境算法

執行 yum install -y nmap-ncat命令在線安裝ncat包swift

1.三、安裝curl

一般狀況下,系統默認已經安裝curl包
如系統未安裝,可經過yum install curl -y命令在線安裝後端

1.四、部署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.一、關閉防火牆

使用過程當中須要關閉防火牆或者開放指定端口,經過如下任意一種方法都可以

  • 關閉防火牆
    執行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.二、關閉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 &

3、配置使用

cosbench工具使用按照流程可分爲如下幾個步驟:參數配置--服務啓動--提交測試--分析結果
示例使用三個節點聯機測試,配置示意以下:

節點主機名 節點IP地址 cosbench角色
node241 66.66.66.241 controller、driver
node242 66.66.66.242 driver
node243 66.66.66.243 driver

一、參數配置

controller和driver依賴不一樣系統配置來啓動服務,在啓動controller和driver服務時,須要先行定義角色配置

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.二、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.一、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.二、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

三、提交測試

可使用如下兩種方法提交測試(示例測試參數文件爲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,提交測試文件便可

四、分析結果

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

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

4、選擇表達式

一、概述

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

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

二、選擇器

表達式 格式 註釋
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)

三、參數組合

基於元素類型和工做類型的選擇器有額外的約束,下面兩個表列出了容許的組合

  • 元素類型選擇器
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()

5、負載配置詳解

本小節主要介紹工做負載參數定義,一般爲標籤對目錄結構的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:工做負載一些相關描述

一、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 指定認證失敗時的重試次數

二、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。

三、workstage定義(工做階段)

<workstage name="<name>" >
</workstage>
  • name:階段的一個名字

四、work定義

4.一、通用格式
<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.二、特殊work
4.2.一、通用格式
<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.二、支持的特殊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即延遲時間(單位爲秒)

五、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 字符串 對象後綴

6、測試結果分析

  • Op-Type
    操做類型,經常使用操做類型有readwritefilewritedelete,具體詳見operation定義(type="")

  • Op-Count
    總操做數

  • Byte-Count
    總字節數

  • Avg-ResTime
    時延(平均響應時間,請求開始到請求完成的持續時間)

  • Throughput(Operations/s)
    IOPS(每秒完成的操做總數)
    注:此處的值由總操做成功請求數除以總運行時間計算而來

  • Bandwidth
    帶寬(每秒傳輸的數據量)
    注:此處數據量進制換算跟實際有所不一樣(1 MB = 1000 × 1000 bytes),故測試的性能值要高於實際值

  • Succ-Ratio
    操做成功率(成功請求數/總請求數)

7、其餘

一、測試總結

一、爲實現最大性能,此處endpoint指向的爲haproxy端口(後端使用均衡模式roundrobin,指向三個集羣節點不一樣網關)
二、全部測試模型執行前需手動清理下緩存sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
三、workers通常設置爲客戶端CPU線程數總大小 grep 'processor' /proc/cpuinfo | sort -u | wc -l
四、objects對象數需爲wokers併發數的整數倍,不然會由於線程數沒法除盡,出現文件上傳不全的狀況
如併發數爲32,上傳對象10000個,實際上傳對象爲‭9984‬個

二、測試模型

序號 客戶端個數 客戶端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.一、單客戶端4K讀寫測試

單個客戶端,單個客戶端線程數3二、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.二、多客戶端4K讀寫測試

三個客戶端,單個客戶端線程數3二、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.三、單客戶端4M讀寫測試

一個客戶端,單個客戶端線程數3二、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.四、多客戶端4M讀寫測試

三個客戶端,單個客戶端線程數3二、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>

三、Q&A

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

注:通常測試讀模型時,須要預填準備測試數據,此時上傳對象須要使用s(min,max)表達式順序執行,從而保證讀取的對象數據徹底

8、使用建議

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

一、cosbench部署建議

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

二、測試用例設計建議

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

三、用例執行建議

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

四、結果分析建議

  1. 確認結果的合理性:執行時間太短不可用(數據不許),數據異常不可用(計算錯誤),運行時間不成比例不可用(說明有性能顯著升降),上傳不徹底不可用(致使結果異常);
  2. 帶寬須要手動計算,提取COSBench中的原始網速數據(以字節爲單位)進行手工換算便可;
  3. 在混合操做測試中,操做數不會嚴格按照比例分佈,但不影響性能結果;
相關文章
相關標籤/搜索