2016-05-18 31 views
2

我們的Mongo數據庫定期(有時​​每天一次)減速大約30-40分鐘。訪問數據庫的API遇到這種緩慢時期每5-10分鐘發生的高延遲峯值。如何診斷週期性MongoDB減速?

望着mongod的日誌文件,這兩條線出現在緩慢的開始,並與每個API潛伏期穗協前前後後(我已經格式化的可讀性JSON):

killcursors keyUpdates:0 numYields:0 locks(micros) r:91 4157ms 
serverStatus was very slow: { 
    after basic: 0, 
    after asserts: 0, 
    after backgroundFlushing: 0, 
    after connections: 0, 
    after cursors: 0, 
    after dur: 0, 
    after extra_info: 0, 
    after globalLock: 0, 
    after indexCounters: 0, 
    after locks: 0, 
    after network: 0, 
    after opcounters: 0, 
    after opcountersRepl: 0, 
    after recordStats: 2359, 
    after repl: 2359, 
    at end: 2359 
} 

查詢在這些之後得到記錄,因爲它們需要幾秒鐘 - 比正常情況慢得多。

似乎沒有太多/任何文檔killCursors,所以我不明白這個日誌條目是什麼意思。 r是指什麼?

killCursors命令是否需要很長時間才能執行,因爲有大量打開的遊標需要清理?據我所知,在我們的應用程序代碼中沒有任何內容會顯式地殺死遊標,那麼這是否正常工作?它經常被記錄,但通常需要20-120ms。

回答

0

默認情況下,服務器會在閒置10分鐘後自動關閉遊標,或者如果客戶端已用盡遊標。

這就是說你可能有一些掉線的連接和清理正在進行 - 或者其他磁盤/系統維護工作可能在同一時間窗口中進行。

要診斷性能下降的根本原因 - 您可以觀察mongo top輸出,檢查磁盤和內存使用情況,並查看哪個特定區域存在峯值。

killCursor參考:manual

+0

感謝鏈接到Cursors頁面 - 我今天早上正在尋找並找不到它。但是這實際上並沒有提到'killCursors'。如果下次發生這種情況,我會看看是否可以跳箱,然後運行「mongotop」和「mongostat」... –