一個cp命令引發的mongodb大量慢查詢

遇到問題:凌晨收到報警,某mongodb服務器cpu load超過8。由於沒有影響到業務,第二天一早開始查原因。


查原因:

1. 先了解該服務器上的應用有哪些

    該db服務器主要應用只有mongodb。於是開始查詢mongodb日誌:

通過凌晨的日誌mongodb.log查看,有大量的慢查詢,但實際上這些表都非常小,只有幾百行數據,而且表還有索引,卻僅僅一個查詢花了60~80s,慢查詢之後的日誌顯示該節點不被其他節點檢測到(mongodb複製集形式)。

wKiom1gZXljjDea6AAmHVICatn8483.png-wh_50

由於一個小表的查詢都需要判斷70s左右,而且mongodb部署的是複製集形式(其他的查詢節點都是正常的)可以判斷,可能是這臺db的性能方面影響了mongodb,而非mongodb本身的性能影響。


2. 於是查看凌晨有什麼任務再跑。

crontab -l 發現確實凌晨有一個任務。是一個切割日誌的腳本。大概就是把日誌cp到另一個目錄,然後將當前日誌清空,繼續記錄新的一天的日誌。


但這個日誌平時都較小,也運行了很長時間.只能試一試的看看日誌目錄


wKioL1gZWOKxEuHYAAATiMt--TM154.png-wh_50


看到日誌突然就這麼大了。難道是因爲晚上cp 文件的時候導致了?

差不多判斷問題出現在 cp導致了io負載過高,進而導致了cpu load 過高。


3. 復現問題

由於該操作在夜間操作,未影響線上業務。故手動操作cp,復現問題。

cp 了一個近3g的文件, 如下圖:看到產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。

跟着cpu load也 上升到10 (每一分鐘的cpu load 值)左右。

wKioL1gZWfCD_61uAAGL7nuZJOM045.jpg-wh_50


解決問題:

將較大的日誌從mongodb服務器分離出。

將小日子日誌腳本切割改爲系統logrotate切割。logrotate會在系統空閒的狀態進行操作。



可是爲什麼拷貝了一個3g的文件,就會導致cpu load 高達10. 進而導致mongodb查詢性能直線下降。

於是我們聯繫了某雲,一個普通雲盤的性能怎會如此低!


以上查問題的思路,最開始也沒有很順利。起初文件較小並沒有猜測到是日誌拷貝。查問題的時候不能以慣性思維排除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章