標籤:UI 目錄 lin rdl hat 入隊 tor 它的 內建
有個需求:跟蹤mongodb的SQL語句及慢查詢收集
第一步:通過mongodb內建函數可以查看在一段時間內DML語句的運行次數。
在bin目錄下面運行 ./mongostat -port 連接埠號碼 則可以看到下面的資料
它的輸出有以下幾列:
- inserts/s 每秒插入次數
- query/s 每秒查詢次數
- update/s 每秒更新次數
- delete/s 每秒刪除次數
- getmore/s 每秒執行getmore次數
- command/s 每秒的命令數,比以上插入、尋找、更新、刪除的綜合還多,還統計了別的命令
- flushs/s 每秒執行fsync將資料寫入硬碟的次數。
- mapped/s 所有的被mmap的資料量,單位是MB,
- vsize 虛擬記憶體使用量,單位MB
- res 實體記憶體使用量,單位MB
- faults/s 每秒訪問失敗數(只有Linux有),資料被交換出實體記憶體,放到swap。不要超過100,否則就是機器記憶體太小,造成頻繁swap寫入。此時要升級記憶體或者擴充
- locked % 被鎖的時間百分比,盡量控制在50%以下吧
- idx miss % 索引不命中所佔百分比。如果太高的話就要考慮索引是不是少了
- q t|r|w 當Mongodb接收到太多的命令而資料庫被鎖住無法執行完成,它會將命令排入佇列。這一欄顯示了總共、讀、寫3個隊列的長度,都為0的話表示mongo毫無壓力。高並發時,一般隊列值會升高。
- conn 當前串連數
- time 時間戳
上面只是大體的查看,並沒有跟蹤到SQL語句。下面開啟慢查詢
在mongodb用戶端運行
db.getProfilingLevel()
以取0,1,2 三個值,他們表示的意義如下:
0 – 不開啟
1 – 記錄慢命令 (預設為>100ms)
2 – 記錄所有命令
更改此值的方法是:假如更改成2
db.setProfilingLevel(2)
Profile 記錄在層級1時會記錄慢命令,那麼這個慢的定義是什嗎?上面我們說到其預設為100ms,當然有預設就有設定,其設定方法和層級一樣有兩種,一種是通過添加–slowms啟動參數配置。第二種是調用db.setProfilingLevel時加上第二個參數:
db.setProfilingLevel( level , slowms )
db.setProfilingLevel( 1 , 10 );
Mongo Profile 記錄是直接存在系統db裡的,記錄位置 system.profile ,所以,我們只要查詢這個Collection的記錄就可以擷取到我們的 Profile 記錄了。
db.system.profile.find()
{"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : "query test.$cmd ntoreturn:1 reslen:66 nscanned:0
query: { profile: 2 } nreturned:1 bytes:50" , "millis" : 0}
db.system.profile.find( { info: /test.foo/ } )
{"ts" : "Thu Jan 29 2009 15:19:40 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0}
{"ts" : "Thu Jan 29 2009 15:19:42 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0}
{"ts" : "Thu Jan 29 2009 15:19:45 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:102 nscanned:2
query: {} nreturned:2 bytes:86" , "millis" : 0}
查看最新的 Profile 記錄:
db.system.profile.find().sort({$natural:-1})
Profile 資訊內容詳解:
ts-該命令在何時執行.
millis Time-該命令執行耗時,以毫秒記.
info-本命令的詳細資料.
query-表明這是一個query查詢操作.
ntoreturn-本次查詢用戶端要求返回的記錄數.比如, findOne()命令執行時 ntoreturn 為 1.有limit(n) 條件時ntoreturn為n.
query-具體的查詢條件(如x>3).
nscanned-本次查詢掃描的記錄數.
reslen-返回結果集的大小.
nreturned-本次查詢實際返回的結果集.
update-表明這是一個update更新操作.
fastmod-Indicates a fast modify operation. See Updates. These operations are normally quite fast.
fastmodinsert – indicates a fast modify operation that performed an upsert.
upsert-表明update的upsert參數為true.此參數的功能是如果update的記錄不存在,則用update的條件insert一條記錄.
moved-表明本次update是否移動了硬碟上的資料,如果新記錄比原記錄短,通常不會移動目前記錄,如果新記錄比原記錄長,那麼可能會移動記錄到其它位置,這時候會導致相關索引的更新.磁碟操作更多,加上索引更新,會使得這樣的操作比較慢.
insert-這是一個insert插入操作.
getmore-這是一個getmore 操作,getmore通常發生在結果集比較大的查詢時,第一個query返回了部分結果,後續的結果是通過getmore來擷取的。
如果只查看query的篩選方法如下:
db.system.profile.find({"op":"query"})
mongodb 跟蹤SQL語句及慢查詢收集