Mongodb性能壓測

一、背景

這幾天對所有的基礎組件做一個摸底的基準壓力測試,目前我們所有的開源基礎組件都沒有做過性能測試,經常有開發人員問,我們的RDS、MongoDB集羣能抗多大量呀,這個時候我是沒辦法回覆的,因爲我自己也不知道,雖然一個數據庫集羣能抗多大量,在軟件、硬件配置固定的情況下,和業務場景有很大的關係,如果數據量小,查詢SQL簡單那吞吐量自然很高,如果數據量特別大並且都是複雜SQL,那吞吐量自然上不去;但是既然人家問了,肯定是希望有一個答案,如果你說不知道,那會給人一種不靠譜的感覺,所以做一次基準壓力測試,我們知道在特定的場景下我們的集羣能有多大的吞吐量,做到自己心裏有數,纔給別人信心。這周在壓測MongoDB,谷歌了一番,MongoDB的壓測工具很少,有幾篇是介紹通過YCSB壓測MongoDB的,找丹姐(邏輯思維首席DBA)推薦一款MongoDB的壓測工具,丹姐也推薦YCSB,好吧,那就它吧,開整。

二、環境說明

1、MongoDB集羣配置(一個分片的shard集羣)

Mongodb性能壓測

2、MongoDB版本

4.0.4-62-g7e345a7
4、系統及內核版本


CentOS Linux release 7.5.1804 (Core)
3.10.0-862.14.4.el7.x86_64

3、YCSB版本

YCSB-0.16.0-RC1.

4、測試說明

Mongodb性能壓測

三、安裝

1、jdk及maven安裝參考官方

https://github.com/brianfrankcooper/YCSB/tree/master/mongodb

2、安裝YCSB

wget https://github.com/brianfrankcooper/YCSB/archive/0.16.0-RC1.tar.gz
tar -zxvf YCSB-0.16.0-RC1.tar.gz
cd YCSB-0.16.0-RC1/
mvn clean package -Dmaven.test.skip=true

PS:
安裝過程中maven下載依賴需要×××,如果有安裝失敗的包,需要在能×××的服務器上下載手動安裝,比如mongodb-async-driver-2.0.1.jar就需要×××,下面是手動安裝方法
A、手動下載jar包
wget http://www.allanbank.com/repo/com/allanbank/mongodb-async-driver/2.0.1/mongodb-async-driver-2.0.1.jar
B、加壓包,從pom.xml 文件裏面查看groupId、artifactId、version
C、手動安裝

mvn install:install-file -Dfile=/tmp/mongodb-async-driver-2.0.1.jar  -DgroupId=com.allanbank -DartifactId=mongodb-async-driver -Dversion=2.0.1 -Dpackaging=jar
mvn -pl com.yahoo.ycsb:mongodb-binding -am clean package

四、壓測

1、編寫壓測文件

在workloads目錄下有很多壓測文件用到的文件,我們從其中一個copy一份,編輯添加我們自己定義的內容

vim workloads/2000w

ongodb.url=mongodb://root:[email protected]:27000
mongodb.writeConcern=normal
table=chj_2000w
recordcount=20000000
operationcount=50000000
readallfields=true
readproportion=0
updateproportion=0
scanproportion=0
insertproportion=1
requestdistribution=zipfian
workload=com.yahoo.ycsb.workloads.CoreWorkload

關於YCSB的壓測文件的每個參數的解釋如下:

fieldcount: 每條記錄字段個數 (default: 10)
fieldlength: 每個字段長度 (default: 100)
readallfields: 是否讀取所有字段true或者讀取一個字段false (default: true)
readproportion: 讀取作業比例 (default: 0.95)
updateproportion: 更新作業比例 (default: 0.05)
insertproportion: 插入作業比例 (default: 0)
scanproportion: 掃描作業比例 (default: 0)
readmodifywriteproportion: 讀取一條記錄修改它並寫回的比例 (default: 0)
requestdistribution: 請求的分佈規則 uniform, zipfian or latest (default: uniform)
maxscanlength: 掃描作業最大記錄數 (default: 1000)
scanlengthdistribution: 在1和最大掃描記錄數的之間的分佈規則 (default: uniform)
insertorder: 記錄被插入的規則ordered或者hashed (default: hashed)
operationcount: 執行的操作數.
maxexecutiontime: 執行操作的最長時間,當然如果沒有超過這個時間以運行時間爲主。
table: 測試表的名稱 (default: usertable)
recordcount: 加載到數據庫的紀錄條數 (default: 0)

2、造數據,也是測寫入性能

./bin/ycsb load mongodb -threads 100 -P workloads/2000w
輸出結果說明

[OVERALL], RunTime(ms), 37182  #數據加載所用時間(毫秒)
[OVERALL], Throughput(ops/sec), 13447.367005540314  #加載操作的吞吐量(ops/sec)
[TOTAL_GCS_PS_Scavenge], Count, 37
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 146
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.3926631165617772
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 37
[TOTAL_GC_TIME], Time(ms), 146
[TOTAL_GC_TIME_%], Time(%), 0.3926631165617772
[CLEANUP], Operations, 64
[CLEANUP], AverageLatency(us), 422.09375
[CLEANUP], MinLatency(us), 0
[CLEANUP], MaxLatency(us), 26911
[CLEANUP], 95thPercentileLatency(us), 3
[CLEANUP], 99thPercentileLatency(us), 30
[INSERT], Operations, 500000  # 執行insert操作的總數
[INSERT], AverageLatency(us), 4658.931652  # 每次insert操作的平均延時(微秒)
[INSERT], MinLatency(us), 831 # 所有insert操作的最小延時(微秒)
[INSERT], MaxLatency(us), 1784831 # 所有insert操作的最大延時(微秒)
[INSERT], 95thPercentileLatency(us), 9711  # 95%的insert操作延時在9毫秒以內
[INSERT], 99thPercentileLatency(us), 17903 # 99%的insert操作延時在17毫秒以內
[INSERT], Return=OK, 500000

3、壓測

通過調整壓測文件中read和update的比例,模擬只讀和讀寫混合的操作

./bin/ycsb run mongodb -threads 100 -P workloads/2000w

[OVERALL], RunTime(ms), 1735408
[OVERALL], Throughput(ops/sec), 2881.1668495247227
[TOTAL_GCS_PS_Scavenge], Count, 3975
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 6180
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.3561122226012557
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 3975
[TOTAL_GC_TIME], Time(ms), 6180
[TOTAL_GC_TIME_%], Time(%), 0.3561122226012557
[READ], Operations, 500346
[READ], AverageLatency(us), 2851.9638989819045
[READ], MinLatency(us), 696
[READ], MaxLatency(us), 646655
[READ], 95thPercentileLatency(us), 6991
[READ], 99thPercentileLatency(us), 23103
[READ], Return=OK, 500346
[CLEANUP], Operations, 10
[CLEANUP], AverageLatency(us), 3131.0
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 31295
[CLEANUP], 95thPercentileLatency(us), 31295
[CLEANUP], 99thPercentileLatency(us), 31295
[UPDATE], Operations, 4499654
[UPDATE], AverageLatency(us), 3534.2083122391186
[UPDATE], MinLatency(us), 704
[UPDATE], MaxLatency(us), 1078271
[UPDATE], 95thPercentileLatency(us), 11647
[UPDATE], 99thPercentileLatency(us), 27343
[UPDATE], Return=OK, 4499654

五、指標觀察

1、服務器指標,主要觀察CPU、內存、磁盤IO的利用率和延時,可以通過top、iostat工具查看實時情況
2、MongoDB可以通過mongostat 工具查看實時情況

mongostat的輸出說明

inserts:每秒插入次數
query:每秒查詢次數
update:每秒更新次數
delete:每秒刪除次數
getmore:每秒執行getmore次數
command:每秒的命令數,比以上插入、查找、更新、刪除的綜合還多,還統計了別的命令
dirty:WiredTiger存儲引擎中dirty 數據佔緩存百分比
used:WiredTiger存儲引擎中引擎使用緩存佔百分比
flushs:每秒執行fsync將數據寫入硬盤的次數。
vsize:虛擬內存使用量,單位MB
res:物理內存使用量,單位MB
qrw:客戶端等待讀的長度,隊列中的長度
arw:客戶端等待寫的隊列長度
netIn 和 netOut:網絡流量,單位是字節 byte
conn:當前連接數
time:時間戳

六、測試結果

Mongodb性能壓測

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章