mongodb性能測試報告

測試目的

模擬生產環境,測試當前mongoDB的各項性能。mongodb

2 測試環境

2.1 軟件配置

2.2 硬件配置

 

測試工具

YCSB是雅虎開源的NoSQL測試工具,一般用來對noSQL數據庫進行性能,這裏咱們使用的是ycsb-mongodb-binding-0.15.0.tar.gz包。shell

須要新建配置文件,並調整參數,並利用load/run命令,加載數據進行性能測試。數據庫

3.1使用簡介

#ycsb包解壓後的目錄結構vim

#使用前,咱們要先了解命令結構後端

命令示例:緩存

#/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb load mongodb -threads 1 -P workloads/workloada -p fieldcount=1  -p fieldlength=1024   -p table=ycsb1 -p clientbuffering=true -p mongodb.url=mongodb://用戶:密碼@ip:port/test?authSource=admin服務器

表1-4 命名參數說明網絡

參數架構

含義分佈式

bin/ycsb

命令自己。

load/run/shell

指定這個命令的做用,分別表明加載數據/運行測試/交互界面。

mongodb/hbase10/basic..

指定此次測試使用的驅動,也就是此次究竟測的是什麼數據庫,有不少選項,能夠ycsb --help看到全部。

threads

線程數,模擬客戶端數

-P

選擇加載的配置文件

workloads/workloada

指定測試的參數文件,默認有6種測試模板,加一個大模板;

workloada:讀寫均衡型,50%/50%,Reads/Writes

workloadb:讀多寫少型,95%/5%,Reads/Writes

workloadc:只讀型,100%,Reads

workloadd:讀最近寫入記錄型,95%/5%,Reads/insert

workloade:掃描小區間型,95%/5%,scan/insert

workloadf:讀寫入記錄均衡型,50%/50%,Reads/insert

workload_template:參數列表模板

-p fieldcount=1

單條記錄字段個數:1

-p fieldlength=1024

每一個字段的大小: 1024Bytes

 -p table=

自定義表名

-p clientbuffering=true

客戶端寫緩存   

-p mongodb.url=

指定測試的數據庫的認證信息,帳號密碼,地址端口和庫名

 

3.2 YCSB測試參數解析

workloads目錄裏面下包含自帶了6種壓力測試場景。 以下圖:

文件和相應場景的對應關係以下:

workloada:讀寫均衡型,50%/50%,Reads/Writes

workloadb:讀多寫少型,95%/5%,Reads/Writes

workloadc:只讀型,100%,Reads

workloadd:讀最近寫入記錄型,95%/5%,Reads/insert

workloade:掃描小區間型,95%/5%,scan/insert

workloadf:讀寫入記錄均衡型,50%/50%,Reads/insert

 

示例文件:

#vim workloads/workloada

表1-5 workload參數含義

參數

含義

recordcount=1000

 

YCSB load(加載元數據)命令的參數,默認值1000表示默認加載的記錄條數,能夠在命令行顯示修改該值。

operationcount=1000

 

YCSB run(運行壓力測試)命令的參數,默認值1000表示默認選取數據庫中的1000條數據進行壓力測試。對於workloada這種測試場景,就意味着讀數據在500左右,寫數據也在500左右。

workload=com.yahoo.ycsb.workloads.CoreWorkload

 

指定了workload的實現類爲 com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

表示查詢時是否讀取記錄的全部字段

readproportion=0.5

表示讀操做的比例,該場景爲0.5

updateproportion=0.5

表示更新操做的比例,該場景爲0.5

scanproportion=0

表示掃描操做的比例

insertproportion=0

表示插入操做的比例

requestdistribution=zipfian

 

表示請求的分佈模式,YCSB提供uniform, zipfian, latest三種分佈模式,

Uniform(等機率隨機選擇記錄)、Zipfian(隨機選擇記錄,存在熱紀錄)和Latest(近期寫入的記錄是熱記錄)

 

3.3 YCSB測試工具命令

1.先爲指定的庫和表指定hash分片

mongo   ip:端口

>sh.enableSharding("test")

>sh.shardCollection("test.usertable", {_id:"hashed"})

 

2.修改業務模型

#cd /opt/ycsb-mongodb-binding-0.15.0/workloads

#只插入100萬條數據

#vi workload-s1

 

 3.數據寫入

#cd /opt/ycsb/ycsb-mongodb-binding-0.15.0

#/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb load mongodb -threads 50 -P workloads/workload-s1-p  fieldcount=1  -p fieldlength=1024 

-p clientbuffering=true  -p table=ycsb1     -p mongodb.url=mongodb://帳號:密碼@ip:端口,ip:端口,ip:端口/test?authSource=admin

 

4.查看插入的數據

#mongo  ip:端口

>use test

>db.stats();

插入100萬條數據後,能夠看到每一個share上都有33萬多的objects,

 

5.結果參數說明

表1-6 ycsb運行結果說明

參數

說明

RunTime(ms):

運行總時間(毫秒)

Throughput(ops/sec):

吞吐量,每秒操做數

[TOTAL_GCS_PS_Scavenge], Count:

 Parallel Scavenge 回收次數

[TOTAL_GC_TIME_PS_Scavenge], Time(ms):

 Parallel Scavenge 回收時間

[TOTAL_GC_TIME_%_PS_Scavenge], Time(%):

 Parallel Scavenge 回收時間百分比

[TOTAL_GCS_PS_MarkSweep], Count:

PS MarkSweep 回收次數

[TOTAL_GC_TIME_PS_MarkSweep], Time(ms):

PS MarkSweep 回收時間

[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%):

PS MarkSweep 回收時間百分比

[TOTAL_GCs], Count:

全局 GC 次數

[TOTAL_GC_TIME], Time(ms):

全局 GC 時間

[TOTAL_GC_TIME_%], Time(%):

全局 GC 時間百分比

不一樣操做類型:READ\UPDATE\INSERT\SCAN等;

 

Operations

總操做數

AverageLatency(us)

平均延遲(微秒)

MinLatency(us)

最小延遲(微秒)

MaxLatency(us)

最大延遲(微秒)

95thPercentileLatency(us) :

95%的樣本延遲低於該值

99thPercentileLatency(us)

99%的樣本延遲低於該值

Return=OK  

結果(正確),總操做數

 

4 測試方法

  • 使用YCSB-mongoDB對測試環境下test庫進行各項測試。

4.1 測試環境

4.2測試模型

4.3測試指標

(1)OPS:Operator per Second,數據庫每秒執行的操做數。

(2)AverageLatency,平均響應時間。

(3)評判指標:直到發現ops再也不增長而平均響應時間繼續增長;

4.4測試步驟

1.先爲指定的庫和表指定hash分片

#mongo   ip:端口

>sh.enableSharding("test")

>sh.shardCollection("test.ycsb1", {_id:"hashed"})

 

2.文檔模型:

修改YCSB配置,每一個文檔大小約爲1KB,默認「_id」索引。

 

3.配置workload文件。

按照表1-8業務模型所示的業務模型,配置workload中的「readproportion」、「insertproportion」、「updateproportion」等值。

 

4.以業務模型workload_s1爲例,執行如下命令,準備數據。

#cd /opt/ycsb/ycsb-mongodb-binding-0.15.0

#/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb load mongodb -threads 50 -P workloads/workload-s1 -p fieldcount=1  -p fieldlength=1024

  -p clientbuffering=true -p table=ycsb1   -p mongodb.url=mongodb://帳號:密碼@ip:端口,ip:端口,ip:端口/test?authSource=admin 

   1>workload_s1_load.result  2> workload_s1_load.log

 

5.以業務模型workload_s1爲例,執行如下命令,測試性能

#cd /opt/ycsb/ycsb-mongodb-binding-0.15.0

#/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb run mongodb -threads 50 -P workloads/workload-s1 -p fieldcount=1  -p fieldlength=1024

-p clientbuffering=true -p table=ycsb1 -p mongodb.url=mongodb://帳號:密碼@ip:端口,ip:端口,ip:端口/test?authSource=admin

  1>workload_s1_run.result  2> workload_s1_run.log

測試用例

5.1  用例1 insert mongoDB測試庫

測試用例1:插入mongoDB測試庫

測試目的

在測試庫100% 導入1億條數據,觀察請求狀態

前置條件

一、mongoDB正常運行
二、客戶端運行正常

步驟

一、根據需求測試項,指定mongodb分片,調整測試模型

二、準備數據 

/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb load mongodb

-threads 50 -P workloads/workload-s1 -p fieldcount=1

 -p fieldlength=1024    -p clientbuffering=true -p  table=ycsb1 

  -p mongodb.url=mongodb://帳號:密碼@ip:端口,ip:端口,ip:端口/test?authSource=admin 

1>workload_s1_load.result  2> workload_s1_load.log

三、測試數據

/opt/ycsb/ycsb-mongodb-binding-0.15.0/bin/ycsb run mongodb -threads 50  -P workloads/workload-s1 -p fieldcount=1  

-p fieldlength=1024    -p clientbuffering=true 

-p table=ycsb1 -p mongodb.url=mongodb://帳號:密碼@ip:端口,ip:端口,ip:端口/test?authSource=admin

 1>workload_s1_run.result  2> workload_s1_run.log

四、記錄測試結果

五、調整線程數,繼續測試,並記錄結果

六、經過調整線程數,直到發現ops再也不增長而響應時間繼續增長。

獲取指標

一、讀寫耗時、吞吐量、平均響應時間

參數化變量

 

數據準備要求

 

備註

在測試前,確保網絡暢通

 

5.2 用例2 update&read mongoDB測試庫

測試用例2:update&read  mongoDB測試庫

測試目的

在測試庫90%更新和10%讀取測試1億條數據,觀察請求狀態

前置條件

一、mongoDB正常運行
二、客戶端運行正常

步驟

一、根據需求測試項,指定mongodb分片,調整測試模型

二、預備數據

     參照如上命令

3.測試數據

       參照如上命令

四、記錄測試結果;

五、調整線程數,繼續測試,並記錄結果;

六、經過調整線程數,直到發現ops再也不增長而響應時間繼續增長。

獲取指標

一、讀寫耗時、吞吐量、平均響應時間

參數化變量

 

數據準備要求

 

備註

在測試前,確保網絡暢通

 

5.3 用例3 read&insert&update mongoDB測試庫

測試用例3:update&read mongoDB測試庫

測試目的

在測試庫65%讀取,10%插入和25%更新測試1億條數據,觀察請求狀態

前置條件

一、mongoDB正常運行
二、客戶端運行正常

步驟

一、根據需求測試項,指定mongodb分片,調整測試模型

二、預備數據

     參照如上命令

3.測試數據

       參照如上命令

四、記錄測試結果;

五、調整線程數,繼續測試,並記錄結果;

六、經過調整線程數,直到發現ops再也不增長而響應時間繼續增長。

獲取指標

一、讀寫耗時、吞吐量、平均響應時間

參數化變量

 

數據準備要求

 

備註

在測試前,確保網絡暢通

 

5.4 用例4 read&update mongoDB測試庫

測試用例4read&update mongoDB測試庫

測試目的

在測試庫50%讀取,50%更新測試1億條數據,觀察請求狀態

前置條件

一、mongoDB正常運行
二、客戶端運行正常

步驟

一、根據需求測試項,指定mongodb分片,調整測試模型

二、預備數據

     參照如上命令

3.測試數據

       參照如上命令

四、記錄測試結果;

五、調整線程數,繼續測試,並記錄結果;

六、經過調整線程數,直到發現ops再也不增長而響應時間繼續增長。

獲取指標

一、讀寫耗時、吞吐量、平均響應時間

參數化變量

 

數據準備要求

 

備註

在測試前,確保網絡暢通

 

5.5 用例5 read  mongoDB測試庫 

測試用例5read mongoDB測試庫

測試目的

在測試庫100%讀取1億條數據,觀察請求狀態

前置條件

一、mongoDB正常運行
二、客戶端運行正常

步驟

一、根據需求測試項,指定mongodb分片,調整測試模型

二、預備數據

     參照如上命令

3.測試數據

       參照如上命令

四、記錄測試結果;

五、調整線程數,繼續測試,並記錄結果;

六、經過調整線程數,直到發現ops再也不增長而響應時間繼續增長。

獲取指標

一、讀寫耗時、吞吐量、平均響應時間

參數化變量

 

數據準備要求

 

備註

在測試前,確保網絡暢通

 

6  測試場景

測試類別

場景

場景的組織

場景的控制

用例

mongoDB性能測試

場景1

6.1插入性能測試 

100% insert

雲服務自帶監控

mongoDB性能測試

場景2

6.2更新,讀取性能測試

90% update ,10% read

雲服務自帶監控

mongoDB性能測試

場景3

6.3讀取,插入,更新性能測試

65% read ,25% insert, 10% update

雲服務自帶監控

mongoDB性能測試

場景4

6.4 讀取,更新性能測試

50% read , 50% update

雲服務自帶監控

mongoDB性能測試

場景5

6.5 讀取性能測試

100% read

雲服務自帶監控

測試結果分析

7.1  Intert性能測試

7.1.1 測試參數記錄

分片集羣100% insert寫入測試記錄結果以下:

線程

類型

數據條數

runtime(ms)

Ops/sec

AverageLatency(us)

操做執行數

50

分片-insert

 

 

   

 

100

分片-insert

 

 

 

 

 

200

分片-insert

 

 

 

 

 

400

分片-insert

 

 

 

   

7.1.2測試結果

 繪製圖表

7.1.3 資源狀況分析

     Mongos是數據庫集羣請求的入口,全部的請求都經過mongos進行協調,不須要在應用程序添加一個路由選擇器,

mongos本身就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。

1.下圖100線程時,使用mongostat監測到mongos的狀況;

 

參數解釋:

inserts   每秒插入次數

command  每秒的命令數

vsize       虛擬內存使用量

res         物理內存使用量

net_in/net_out  網絡進出流量

 

2.下圖爲200線程時,mongos的cpu和帶寬使用狀況;

 

 

     Mongos的cpu使用率穩定在50%左右,輸入流量穩定在13MB/s;mongos進行協調請求,

再將數據進行轉發到後端;經過監控到mongos的cpu,內存,網絡帶寬一直處在穩定的狀態;

 

 3.Config server,爲配置服務器,存儲全部數據庫元信息(路由、分片)的配置。在生

 產環境一般有多個 config server 配置服務器,由於它存儲了分片路由的元數據,防止數據丟失。

下圖爲400線程下config的cpu和內存使用率;cpu穩定在20%如下,內存穩定在30%如下;

 

 

4.每一個分片都是一個獨立的數據庫,全部的分片組合起來構成一個邏輯上的完整的數據庫。

分片機制下降了每一個分片的數據操做量及須要存儲的數據量,達到多臺服務器來應對不斷增長的負載和數據的效果。

下圖爲400線程,share的cpu,內存和帶寬使用狀況,看到cpu大部分時間已處於100%的狀態;內存使用率在60%如下,帶寬爲16MB/s;

 

 

 

在雲環境上,後端爲分佈式存儲池,沒法監控具體的磁盤寫入狀況;

但每當內存中的數據累計到必定量(或者必定時間),MongoDB會將內存數據flush到磁盤,

並清理髒頁數據,此時該shard的cpu使用率也會飆升,達到規格上限;

 

後續省略

測試結果總結

1.當前測試結果繪製圖表

2.當前瓶頸分析

Sharding cluster是一種能夠水平擴展的模式,在數據量很大時特給力,實際大規模應用通常會採用這種架構去構建。

 sharding分片很好的解決了單臺服務器磁盤空間、內存、cpu等硬件資源的限制問題,把數據水平拆分出去,下降單節點的訪問壓力。

從以上測試記錄,當share的cpu達到100%時,插入,更新和讀取等操做性能有所降低,綜上,目前性能受限於分片的cpu。

特別說明:測試結論只適用於本次測試;

相關文章
相關標籤/搜索