mongodb效能壓測
一直想知道mongodb的效能如何,今天對壓測結果做了下總結
資料:每條記錄約208 Byte,僅壓測update操作(存在就修改,不存在則插入)。
配置1:單機的mongodb,單表記錄數6百萬左右。
1.啟用journal約6500 qps, 每隔60秒有一次抖動,因為配置成60秒將記憶體資料落盤一次,落盤期間磁碟的tps會大增,約700,其他時刻僅50左右的tps。
2.不啟用journal穩定在7000qps。沒有抖動。磁碟的tps和情況1一樣,只是未開啟journal,即使落盤也不影響效能。
3.同一臺機器啟動兩個不相干的mongodb服務,都啟用journal,分別由兩個client寫入資料。初始時總寫入qps有2*6000左右,
一段時間後會降到6000左右,服務A的qps約2000,服務B的qps約4000。關閉服務B的壓力,服務A的qps能上升到6000。
因此可以推測一臺機器上,開啟journal時只能維持6000左右的寫入qps。
配置2:
一個sharding, 一主兩從部署在不同的機器上,單表記錄數8百萬左右。
1. 主庫從庫都開啟journal,當單表8百萬記錄時,update操作約5000qps,比單機效能略低,可能是主從同步的原因。和單機一樣每隔60秒落盤會有一次抖動。
2. 主庫關閉journal,從庫關閉journal,update操作穩定在6500qps。
3. 在機器A上同時部署兩個sharding的從庫,兩個sharding的主庫分別部署在機器B和機器C,都開啟journal,這兩個sharding的總寫入量約1萬qps。一段時間後,發現這臺從庫跟不上主庫的寫入速度,差了1000多秒,如圖1:
圖1. 從庫落後主庫的時間
配置3:
4個sharding,每個一主兩從,由於機器有限,12個數據混布在四臺機器上,壓測一段時間後,寫入qps只能達到3000左右,原因:
1. 由於一臺機器混布了3個數據節點,承受了3倍的壓力。
2. Mongodb的auto sharding將資料劃分不均勻,壓力主要落在兩個sharding上。每個sharding的記錄數嚴重不均勻:
每個sharding的個數如下: “set1" : {"ns" : "im.user",
"count" : 35923922,
"size" : 7472175792,
"ns" : "im.user",
"count" : 4452753,
"size" : 926172624, "set3" : {
"ns" : "im.user",
"count" : 1617964,
"size" : 336536512, "set4" : {
"ns" : "im.user",
"count" : 24297263,
"size" : 5053830704, 機器: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
12核
64G記憶體
總結:
在不混布的情況下,單個sharding資料節點能承受5000qps左右update操作(先查詢再寫入),由於autosharding不均勻可以考慮採用pre-sharding的方式。