paulwong

          mongodb的監控與性能優化

          .mongodb的監控

           

          mongodb可以通過profile來監控數據,進行優化。

          查看當前是否開啟profile功能用命令

          db.getProfilingLevel()  返回level等級,值為0|1|2,分別代表意思:0代表關閉,1代表記錄慢命令,2代表全部

          開始profile功能為

          db.setProfilingLevel(level);  #level等級,值同上

          level為1的時候,慢命令默認值為100ms,更改為db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)這樣就更改為50毫秒

          通過db.system.profile.find() 查看當前的監控日志。

          如:

           

           

          Js代碼  
          1. > db.system.profile.find({millis:{$gt:500}})  
          2. { "ts" : ISODate("2011-07-23T02:50:13.941Z"), "info" : "query order.order reslen:11022 nscanned:672230  \nquery: { status: 1.0 } nreturned:101 bytes:11006 640ms", "millis" : 640 }  
          3. { "ts" : ISODate("2011-07-23T02:51:00.096Z"), "info" : "query order.order reslen:11146 nscanned:672302  \nquery: { status: 1.0, user.uid: { $gt: 1663199.0 } }  nreturned:101 bytes:11130 647ms", "millis" : 647 }  

           這里值的含義是

           

          ts:命令執行時間

          info:命令的內容

          query:代表查詢

          order.order: 代表查詢的庫與集合

          reslen:返回的結果集大小,byte數

          nscanned:掃描記錄數量

          nquery:后面是查詢條件

          nreturned:返回記錄數及用時

          millis:所花時間


           

          如果發現時間比較長,那么就需要作優化。

          比如nscanned數很大,或者接近記錄總數,那么可能沒有用到索引查詢。

          reslen很大,有可能返回沒必要的字段。

          nreturned很大,那么有可能查詢的時候沒有加限制。


          mongo可以通過db.serverStatus()查看mongod的運行狀態

           

           

          Js代碼  
          1. > db.serverStatus()  
          2. {  
          3.     "host" : "baobao-laptop",#主機名  
          4.     "version" : "1.8.2",#版本號  
          5.     "process" : "mongod",#進程名  
          6.     "uptime" : 15549,#運行時間  
          7.     "uptimeEstimate" : 15351,  
          8.     "localTime" : ISODate("2011-07-23T06:07:31.220Z"),當前時間  
          9.     "globalLock" : {  
          10.         "totalTime" : 15548525410,#總運行時間(ns)  
          11.         "lockTime" : 89206633,  #總的鎖時間(ns)  
          12.         "ratio" : 0.005737305027178137,#鎖比值  
          13.         "currentQueue" : {  
          14.             "total" : 0,#當前需要執行的隊列  
          15.             "readers" : 0,#讀隊列  
          16.             "writers" : 0#寫隊列  
          17.         },  
          18.         "activeClients" : {  
          19.             "total" : 0,#當前客戶端執行的鏈接數  
          20.             "readers" : 0,#讀鏈接數  
          21.             "writers" : 0#寫鏈接數  
          22.         }  
          23.     },  
          24.     "mem" : {#內存情況  
          25.         "bits" : 32,#32位系統  
          26.         "resident" : 337,#占有物理內存數  
          27.         "virtual" : 599,#占有虛擬內存  
          28.         "supported" : true,#是否支持擴展內存  
          29.         "mapped" : 512  
          30.     },  
          31.     "connections" : {  
          32.         "current" : 2,#當前鏈接數  
          33.         "available" : 817#可用鏈接數  
          34.     },  
          35.     "extra_info" : {  
          36.         "note" : "fields vary by platform",  
          37.         "heap_usage_bytes" : 159008,#堆使用情況字節  
          38.         "page_faults" : 907 #頁面故作  
          39.     },  
          40.     "indexCounters" : {  
          41.         "btree" : {  
          42.             "accesses" : 59963, #索引被訪問數  
          43.             "hits" : 59963, #所以命中數  
          44.             "misses" : 0,#索引偏差數  
          45.             "resets" : 0,#復位數  
          46.             "missRatio" : 0#未命中率  
          47.         }  
          48.     },  
          49.     "backgroundFlushing" : {      
          50.         "flushes" : 259,  #刷新次數  
          51.         "total_ms" : 3395, #刷新總花費時長  
          52.         "average_ms" : 13.108108108108109, #平均時長  
          53.         "last_ms" : 1, #最后一次時長  
          54.         "last_finished" : ISODate("2011-07-23T06:07:22.725Z")#最后刷新時間  
          55.     },  
          56.     "cursors" : {  
          57.         "totalOpen" : 0,#打開游標數  
          58.         "clientCursors_size" : 0,#客戶端游標大小  
          59.         "timedOut" : 16#超時時間  
          60.     },  
          61.     "network" : {  
          62.         "bytesIn" : 285676177,#輸入數據(byte)  
          63.         "bytesOut" : 286564,#輸出數據(byte)  
          64.         "numRequests" : 2012348#請求數  
          65.     },  
          66.     "opcounters" : {  
          67.         "insert" : 2010000, #插入操作數  
          68.         "query" : 51,#查詢操作數  
          69.         "update" : 5,#更新操作數  
          70.         "delete" : 0,#刪除操作數  
          71.         "getmore" : 0,#獲取更多的操作數  
          72.         "command" : 148#其他命令操作數  
          73.     },  
          74.     "asserts" : {#各個斷言的數量  
          75.         "regular" : 0,  
          76.         "warning" : 0,  
          77.         "msg" : 0,  
          78.         "user" : 2131,  
          79.         "rollovers" : 0  
          80.     },  
          81.     "writeBacksQueued" : false,  
          82.     "ok" : 1  
          83. }  
           

           

          db.stats()查看某一個庫的原先狀況

           

          Java代碼  
          1. > db.stats()  
          2. {  
          3.     "db" : "order",#庫名  
          4.     "collections" : 4,#集合數  
          5.     "objects" : 2011622,#記錄數  
          6.     "avgObjSize" : 111.92214441878245,#每條記錄的平均值  
          7.     "dataSize" : 225145048,#記錄的總大小  
          8.     "storageSize" : 307323392,#預分配的存儲空間  
          9.     "numExtents" : 21,#事件數  
          10.     "indexes" : 1,#索引數  
          11.     "indexSize" : 74187744,#所以大小  
          12.     "fileSize" : 1056702464,#文件大小  
          13.     "ok" : 1  
          14. }  

           

           查看集合記錄用

          Java代碼  收藏代碼
          1. > db.order.stats()  
          2. {  
          3.     "ns" : "order.order",#命名空間  
          4.     "count" : 2010000,#記錄數  
          5.     "size" : 225039600,#大小  
          6.     "avgObjSize" : 111.96,  
          7.     "storageSize" : 307186944,  
          8.     "numExtents" : 18,  
          9.     "nindexes" : 1,  
          10.     "lastExtentSize" : 56089856,  
          11.     "paddingFactor" : 1,  
          12.     "flags" : 1,  
          13.     "totalIndexSize" : 74187744,  
          14.     "indexSizes" : {  
          15.         "_id_" : 74187744#索引為_id_的索引大小  
          16.     },  
          17.     "ok" : 1  
          18. }  
           

          mongostat命令查看運行中的實時統計,表示每秒實時執行的次數

          mongodb還提供了一個機遇http的監控頁面,可以訪問http://ip:28017來查看,這個頁面基本上是對上面的這些命令做了一下綜合,所以這里不細述了。

          二.mongodb的優化

          根據上面這些監控手段,找到問題后,我們可以進行優化

          上面找到了某一下慢的命令,現在我們可以通過執行計劃跟蹤一下,如

          Java代碼  
          1. > db.order.find({ "status": 1.0, "user.uid": { $gt: 2663199.0 } }).explain()  
          2. {  
          3.     "cursor" : "BasicCursor",#游標類型  
          4.     "nscanned" : 2010000,#掃描數量  
          5.     "nscannedObjects" : 2010000,#掃描對象  
          6.     "n" : 337800,#返回數據  
          7.     "millis" : 2838,#耗時  
          8.     "nYields" : 0,  
          9.     "nChunkSkips" : 0,  
          10.     "isMultiKey" : false,  
          11.     "indexOnly" : false,  
          12.     "indexBounds" : {#使用索引(這里沒有)  
          13.           
          14.     }  
          15. }  
           對于這樣的,我們可以創建索引

          可以通過  db.collection.ensureIndex({"字段名":1}) 來創建索引,1為升序,-1為降序,在已經有多數據的情況下,可用后臺來執行,語句db.collection.ensureIndex({"字段名":1} , {backgroud:true}) 

          獲取索引用db.collection.getIndexes() 查看

          這里我們創建一個user.uid的索引 >db.order.ensureIndex({"user.uid":1})

          創建后重新執行

          Java代碼  
          1. db.order.find({ "status": 1.0, "user.uid": { $gt: 2663199.0 } }).explain()  
          2. {  
          3.     "cursor" : "BtreeCursor user.uid_1",  
          4.     "nscanned" : 337800,  
          5.     "nscannedObjects" : 337800,  
          6.     "n" : 337800,  
          7.     "millis" : 1371,  
          8.     "nYields" : 0,  
          9.     "nChunkSkips" : 0,  
          10.     "isMultiKey" : false,  
          11.     "indexOnly" : false,  
          12.     "indexBounds" : {  
          13.         "user.uid" : [  
          14.             [  
          15.                 2663199,  
          16.                 1.7976931348623157e+308  
          17.             ]  
          18.         ]  
          19.     }  
          20. }  
           

          掃描數量減少,速度提高。mongodb的索引設計類似與關系數據庫,按索引查找加快書讀,但是多了會對寫有壓力,所以這里就不再敘述了。


          2.其他優化可以用hint強制索引查找,返回只是需要的數據,對數據分頁等。

          posted on 2015-12-16 18:50 paulwong 閱讀(765) 評論(0)  編輯  收藏 所屬分類: MONGODB

          主站蜘蛛池模板: 岳普湖县| 项城市| 武安市| 察雅县| 大埔县| 潜江市| 额敏县| 丰镇市| 罗山县| 高邮市| 东至县| 金溪县| 郑州市| 历史| 内丘县| 阜新| 青河县| 蒲江县| 夏津县| 浠水县| 郯城县| 克东县| 西乡县| 高密市| 获嘉县| 宿松县| 苏尼特左旗| 枝江市| 视频| 谷城县| 湟源县| 金山区| 南宁市| 正镶白旗| 略阳县| 桃园市| 德惠市| 镇平县| 方城县| 华容县| 米易县|