mongodb下cpu高的查詢方式(慢查詢)


1.查看mongodb進程 ps-ef | grep mongo 獲取進程id為3267

2.查看進程的線程 top -p 3267 按shift+h 查看cpu高的線程,發現有線程點用cpu高且cpu時間很長,有線程的cpu時間有23分鍾,說明一直有線程在消耗cpu,要找到執行這個線程在具體做什么操作

找到目前占用cpu最高的線程id為46265,該線程占用cpu 85.2%現在,如下圖。

3.查看mongo進程3267的各線程系統調用情況

pstack 3267 >stack.log 導出到stack.log 見附件 stack.log 發現了290個線程如下圖

從線程中找出上面的id為46265線程如下圖,下圖中紅線畫出的就是操作系統中給mongo的進程3267分配的線程id:46265,這個46265對應的mongo堆客棧中的線程id即為下圖中白色的橫線處的16進制的id:0x7f2311c18700

將16進程的0x7f2311c18700 轉換為10進制

printf %d 0x7f230dad7700 結果

139788530054912

如下圖紅線中所示

上面紅線中的數字非常重要,上面這個數字即為接下來要查找問題的關鍵

4.查看mongo當前有哪些操作,

執行命令:db.currentOp(true); 如下圖所示,在結果中查找 139788530054912 找到如下圖所示的查詢操作,下面的這個threadId對就的操作即為剛才用cpu高的查更新操作,

到此就找出了占用cpu高的mongo的操作,此次為更新操作導致該線程占用cpu高。

本文結合操作系統的堆棧調用命令pstack 和mongodb的命令db.currentOp(true);快速定位cpu占用高的mongo操作。希望對大家有所幫助。

 

為了方便查看,可以開啟mongo的慢日志記錄,操作如下

1.查看mongodb慢日志是否開起

use BJ_Rack;

db.getProfilingStatus();

發現沒有開戶慢日志

2.開啟慢日志,設置超過100毫秒的操作為慢操作

db.setProfilingLevel(1,100); 

3.查看慢日志內容

db.system.profile.find().sort({$natural:-1})

得到50個比較慢的操作日志,

詳情見附件 mongodb慢日志的操作

上面日志中最高的操作時間差不多2秒

慢日志對mongo性能分析很有用,建議在測試的時候都開啟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM