MongoDB資料庫順序讀效能評估測試

清風艾艾發表於2016-08-11
    最近,公司一專案實施需要對MongoDB資料庫的順序讀效能進行評估測試,已備專案實施提供決策依據。
    問題:主單對應的明細表關係,每一條主單在明細表中都有大量的明細存在,而明細單獨以單個文件儲存在mongodb中會因為key-value關係浪費大量的key值空間。
    解放方法:將明細表中的同一主單對應的明細壓縮到一個文件中,提取冗餘欄位屬性,將明細特有key-value組織成一個陣列,這樣資料相對集中,可以提高mongodb的順序讀效能。
    前提:主單對應的明細條數不能過多,壓縮匯聚的明細總體積不能超過當前mongodb支援的單個文件的最大體積,具體看資料庫配置,有的限制是16MB,有的32MB,有的是64MB;我們的庫最大文件支援16MB。
    測試前準備:在同一個mongodb資料庫中存放最佳化前的資料集合、最佳化後的資料集合,例如我們最佳化前的集合是bill_detail、最佳化後的集合是detail_coll。
    測試方法:測試方法如下表格所示

[mongodb@se122 test1]$ cat bill_detail_ETL_Patient_IDStr1.sh

currentTime1=`date +%Y%m%d%H%M%S`

echo "start_time:" $currentTime1

mongo --port 27000 wl_insert /home/mongodb/test1/bill_detail_ETL_Patient_IDStr1.js

currentTime2=`date +%Y%m%d%H%M%S`

echo "finish_time:" $currentTime2

time3=$(($currentTime2 - $currentTime1))

echo "execution time_elapsed:" $time3

[mongodb@se122 test1]$

[mongodb@se122 test1]$ cat bill_detail_ETL_Patient_IDStr1.js

var cursor = db.ETL_Patient_IDStr.find();

var i=0;

while(cursor.hasNext()){

 var obj = cursor.next();

 if(i<=1157){

 db.bill_detail.find({"ETL_Patient_IDStr":obj.ETL_Patient_IDStr}).explain("executionStats");

 }

 if(i>1157){

  break;

 }

 i++;

}

[mongodb@se122 test1]$

    測試方法說明:如表格所示,對最佳化前後的明細表各寫四對sh和js指令碼,其中每個sh單迴圈執行一次對應.js指令碼,其中.js指令碼對最佳化前後的集合分段執行從磁碟載入到mongo資料庫記憶體的操作,四對sh和js指令碼同時執行,將整個最佳化前或最佳化後的集合載入到伺服器記憶體。測試前清理伺服器記憶體及快取,重啟資料庫,先測試最佳化後的文件detaill_coll;再清理伺服器記憶體及快取,重啟資料庫,後測試最佳化前的文件bill_detail。
    測試總覽表格:

            對比

指標

最佳化前

最佳化後

對比度

期望

資料量

55357286

427003

7.70%

減少

集合並行載入時間

932s

432s

46.35%

降低

儲存磁碟IO請求數峰值

3917/s

887/s

22.64%

降低

儲存磁碟IO吞吐量峰值

15.88MB/s

19.38MB/s

22.04%

提高

mongo資料返回峰值

23.4KB/s

52.8KB/s

55.68%

提高

mongo消耗記憶體

52.4GB

36GB

31.30%

下降

mongo消耗快取

66%

50%

16%

下降

    結合一款grafana軟體,結果會更直觀:
圖4 最佳化後的讀操作磁碟IO請求

圖5最佳化前的讀操作磁碟IO請求

針對圖4、圖5,相同查詢操作測試下,最佳化前的物理磁碟IO請求數峰值是3917次/s,最佳化後的物理磁碟IO請求數峰值降低到887次/s,另外,可以看出,最佳化前查詢操作導致磁碟IO請求居高不下。
圖6 最佳化後的查詢操作IO吞吐量

圖7 最佳化前的查詢操作IO吞吐量

針對圖6、圖7,相同查詢操作測試下,最佳化前的物理磁碟IO吞吐量數峰值是15.88MB/s,最佳化後的物理磁碟IO請求數峰值提高到19.39MB/s,最佳化後順序IO提高了磁碟IO讀效能,相比最佳化前提高了3.5MB/s;另外,磁碟IO高峰期,最佳化後相比最佳化前在時間上有明顯的縮短。
圖8 最佳化後的mongo資料庫資料返回

圖9 最佳化前的mongo資料庫資料返回

針對圖8、圖9,相同查詢操作測試下,最佳化前mongo資料庫資料返回數峰值是23.4kb/s,最佳化後的mongo資料庫資料返回數峰值提升到52.8kb/s,最佳化後資料分佈有利於資料庫順序讀,明顯提升了mongo資料庫順序讀的效能,同時降低了mongo資料庫高負載時間。
圖10 最佳化後的mongo資料庫佔用主機記憶體

圖11 最佳化前的mongo資料庫佔用主機記憶體

針對圖10、圖11,
從圖10-圖11,顯示的資料可以看出,最佳化後相比最佳化前,mongo資料庫佔用的主機記憶體下降31.30%。
    以上圖表資料,除了使用grafana軟體,也可以使用linux作業系統命令獲得。
    測試過程中,使用echo 1 > /proc/sys/vm/drop_caches命令來清空主機快取,透過ps -ef|grep mongo來查詢mongodb的資料庫主程式,如下所示131351程式就是啦,使用kill -2 131351命令關閉資料庫,再重啟來清空資料庫記憶體的佔用。
[root@se122 ~]# ps -ef|grep mongo
mongodb   66833      1  5 Aug01 ?        13:48:42 mongos --configdb 10.117.130.121:27001 --logpath /home/mongodb/mongodata/logs/mongos.log --port 27000 --fork
root      72060  71965  0 10:58 pts/1    00:00:00 grep --color=auto mongo
root      75111  75073  0 Aug09 pts/7    00:00:00 su - mongodb
mongodb   75112  75111  0 Aug09 pts/7    00:00:00 -bash
root     107805      1  0 Aug08 ?        00:00:00 su - mongodb
mongodb  107806 107805  0 Aug08 ?        00:00:00 -bash
mongodb  107849 107806  0 Aug08 ?        00:00:01 mongo --port 27000
mongodb  131351      1  0 Aug08 ?        00:23:21 mongod --dbpath /home/mongodb/mongodata/rs1 --logpath /home/mongodb/mongodata/logs/rs1.log --port 27011 --directoryperdb --syncdelay 15 --fork
[root@se122 ~]# 
[root@se121 ~]#  iostat -txk 2  #使用該命令可以持續獲得磁碟IO使用情況
Linux 3.10.0-327.10.1.el7.x86_64 (se121) 08/09/2016 _x86_64_ (32 CPU)
08/09/2016 10:03:01 AM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.67    0.00    0.63    0.03    0.00   98.67


Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   46.50   12.50  1170.00    98.25    42.99     0.18    3.03    3.83    0.04   0.56   3.30
dm-0              0.00     0.00   12.00   10.50   764.00    93.25    76.20     0.02    0.78    1.42    0.05   0.76   1.70
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00   35.00    2.00   412.00     5.00    22.54     0.16    4.34    4.59    0.00   0.45   1.65
dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00


08/09/2016 10:03:03 AM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.81    0.00    0.49    1.17    0.00   97.53


Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     2.50  966.50   28.00  6724.00   138.75    13.80     1.28    1.29    1.33    0.00   0.93  92.95
dm-0              0.00     0.00  241.50   17.00  3672.00    79.00    29.02     0.38    1.46    1.56    0.00   1.30  33.70
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00  725.00   13.50  3048.00    59.75     8.42     0.91    1.23    1.25    0.00   1.22  90.20
dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00


08/09/2016 10:03:05 AM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.30    0.00    0.23    0.09    0.00   99.37


Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00  809.00    2.50  3312.50     7.00     8.18     0.88    1.09    1.09    0.20   1.08  87.70
dm-0              0.00     0.00    4.50    0.50    18.50     2.00     8.20     0.01    1.10    1.22    0.00   0.60   0.30
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00  804.50    2.00  3294.00     5.00     8.18     0.88    1.09    1.09    0.25   1.09  88.20
dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
[BEGIN] 2016/8/9 10:06:26
free -s 10 -m 10   #使用該命令可以持續獲得主機記憶體、快取的使用資料
              total        used        free      shared  buff/cache   available
Mem:         128662       15784      110015         137        2862      112370
Swap:          4095          28        4067


              total        used        free      shared  buff/cache   available
Mem:         128662       16595      109069         137        2998      111560
Swap:          4095          28        4067



              total        used        free      shared  buff/cache   available
Mem:         128662       49774       70199         137        8689       78381
Swap:          4095          28        4067
經過單位換算後,就可以完成測試總覽表格了。
    總結,文件聚合最佳化,使得資料相對集中,有利於mongodb的順序讀,對於需要mongodb短時間內載入大量資料到記憶體或獲取到應用伺服器是有利的。
    宣告:實驗過程、結果及對mongodb認識,如果有不妥的地方,我接受批評指正。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2123310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章