mongodb 跟蹤SQL語句及慢查詢收集

來源:互聯網
上載者:User

標籤: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語句及慢查詢收集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.