記錄一次MongoDB3.0.6版本wiredtiger與MMAPv1引擎的寫入耗時對比

1、MongoDB3.0.x的版本特性(相對於MongoDB2.6及如下)
  • 增長了wiredtiger引擎:
  • 開源的存儲引擎;
  • 支持多核CPU、充分利用內存/芯片級別緩存(注:10月14日剛剛發佈的3.0.7版本中,進一步改進了內存操做的性能);
  • 基於B-TREE及LSM算法;
  • 提供文檔級鎖(document-level concurrency control),相似於關係型數據庫的的行級鎖;
  • 支持文件壓縮(其中snappy壓縮機制能夠在5%的額外CPU消耗,減小70%的空間使用,也能夠根據須要調節壓縮比例),三種壓縮類型:
  • 不壓縮;
  • Snappy壓縮:默認的壓縮方式, Snappy是在谷歌內部生產環境中被許多項目使用的壓縮庫,包括BigTable,MapReduce和RPC等,壓縮速度比Zlib快,可是壓縮處理文件的大小會比Zlib大20%-100%, Snappy對於純文本的壓縮率爲1.5-1.7,對於HTML是2-4,對於JPEG、PNG和其餘已經壓縮過的數據壓縮率爲1.0。在I7 i7 5500u 單核CPU測試中,壓縮性能可在200M/s-500M/s;
  • Zlib壓縮: Z1ib是一個免費、通用、跨平臺、不受任何法律阻礙的、無損的數據壓縮開發庫,相對於Snappy壓縮,消耗CPU性能高、壓縮速度慢,可是壓縮效果好。
  • MMAPv1引擎(MongoDB2.6及如下版本用的是MMAP引擎):
  • collection鎖(collection-level concurrency control),在MMAP版本中,只提供了database的鎖(既當一個用戶對一個collection進行操做時,其餘的collection也被掛起);
  • 無縫遷移(MMAP版本的數據能夠在線遷移至MMAPV1版本,也能夠遷移至wiredtiger引擎中)。  
  • 可插拔的存儲引擎API(相似於mysql的多引擎驅動)
  • 經過不一樣的數據引擎來知足不一樣的數據需求;
  • 將來更多的場景擴展。
  • Ops manager(MongoDB企業版提供的功能)
  • 居於web的圖形管理界面
  • 減小平常平常和配置的工做
 
2、測試環境:

服務器硬件配置:172.16.16.169 CPU:2*E5620  @ 2.40GHz、內存:8Gpython

客戶端硬件配置:172.16.40.92 CPU: 4*I5-4300U@ 1.90GHz、內存:4Gmysql

數據庫:mongodb V3.0.6web

開發環境:python3.4.三、pycharm4.5.4算法

測試前提:已安裝完成了mongodb、python、pycharm
 
 
3、測試場景:插入100萬條數據的時間消耗對比;
      1. 在服務器端啓動MongoDB(默認爲MMAPv1引擎,默認端口爲27017,在MongoDB的安裝目錄中啓動MongoDB,定義數據和日誌路徑):
#./mongod --dbpath=/data/db --logpath=/data/log 
      2. 登陸MongoDB:
#./mongo      
      3. 查看當前的引擎狀態:
> db.serverStatus()  
"storageEngine" : {
                "name" : "mmapv1"
      4. 在服務器端啓動MongoDB(WiredTiger引擎,端口:11111,在MongoDB的安裝目錄中啓動MongoDB,定義數據和日誌路徑,定義WiredTiger引擎):
#./mongod --dbpath=/data/wiredtiger --logpath=/data/wiredtiger/log  
      5. 登陸至啓動了WiredTiger引擎的Mongodb:
#./mongo  127.0.0.1:11111 
      6. 查看當前的引擎狀態:
> db.serverStatus()  
"storageEngine" : {
                "name" : "wiredTiger"
 
      7. python鏈接MongoDB MMAPv1寫入配置:
import  time
import datetime
import  timeit
import  math
ISOTIMEFORMAT = '%Y-%m-%d %X'

from pymongo import MongoClient
mc = MongoClient("172.16.16.169",27017)
db = mc.users
def dateDiffInSeconds(date1,date2):
    timedelta = date2 - date1
    return timedelta.days*24*3600 +timedelta.seconds
date1 = datetime.datetime.now()
db.users.drop()
for i  in range(0,1000000) :db.users.insert({"name":"ljai","age":i,"addr":"fuzhou"})
c = db.users.find().count()
print("count is ",c)
date2 = datetime.datetime.now()
print(date1)
print(date2)
print(dateDiffInSeconds(date1,date2),"seconds")
mc.close()

  8. 測試結果:100萬條數據寫入花費了12分鐘28秒:sql

 二、 python鏈接MongoDB WiredTiger寫入配置:mongodb

import  time
import datetime
import  timeit
import  math
ISOTIMEFORMAT = '%Y-%m-%d %X'

from pymongo import MongoClient
mc = MongoClient("172.16.16.169",27017)
db = mc.users
def dateDiffInSeconds(date1,date2):
    timedelta = date2 - date1
    return timedelta.days*24*3600 +timedelta.seconds
date1 = datetime.datetime.now()
db.users.drop()
for i  in range(0,1000000) :db.users.insert({"name":"ljai","age":i,"addr":"fuzhou"})
c = db.users.find().count()
print("count is ",c)
date2 = datetime.datetime.now()
print(date1)
print(date2)
print(dateDiffInSeconds(date1,date2),"seconds")
mc.close()

 9. 測試結果:100萬條數據寫入花費了10分3秒:數據庫

 
 
100萬條的數據寫入,WireTiger引擎會比MMAPv1快一些,後續再繼續其餘方面的性能測試。
相關文章
相關標籤/搜索