crond不斷喚起sendmail導致資源耗盡的排查

小米雲技術發表於2019-03-19
本文主要介紹了crond不斷喚起sendmail導致資源耗盡的排查相關內容。
上篇文章回顧:理解Nginx中Server和Location的匹配邏輯

春節值班期間收到反饋,c3-im-msg-tun001.bj 和 c3-im-msg-tun002.bj 這兩臺伺服器資源使用異常,主要是mem和disk,監控圖如下,圖中資源佔用突降是手動清理程式和檔案的結果,這種手段治標不治本。

crond不斷喚起sendmail導致資源耗盡的排查

                                                               記憶體圖

crond不斷喚起sendmail導致資源耗盡的排查

                                                                硬碟圖

異常現象檢查
記憶體異常

發現很多sendmail程式,每分鐘增加一個,消耗記憶體資源

[root@c3-im-msg-tun002 ~]# ps -ef |grep sendmail | wc -l14069複製程式碼
硬碟異常

磁碟佔用: /var/log/maillog 檔案佔滿硬碟

檢視報錯

tail -fn 123 /var/log/maillogc3-im-msg-tun002 postfix/postdrop[26422]: warning: mail_queue_enter: create file maildrop/8765.26422: No such file or directory複製程式碼

報錯原因:缺少路徑 maildrop

解決思路: 參考正常伺服器,新建缺少的資料夾

解決記錄如下:

正常伺服器檔案許可權

crond不斷喚起sendmail導致資源耗盡的排查

cd /var/spool/postfixmkdir maildrop && chown postfix.postdrop maildrop && chmod 730 maildrop複製程式碼

觀察sendmail程式依舊增加

索性測試給777許可權

chmod 777 maildrop複製程式碼

sendmail程式開始消失,maildrop中寫入新檔案

crond不斷喚起sendmail導致資源耗盡的排查

結合檔案屬組,最後給maildrop 配置屬組 root.root ,許可權775

異常程式排查

繼續查詢誰喚起的sendmail。由之前觀察程式數每分鐘增加,懷疑是定時任務。

使用pstree命令檢視

pstree -a | more複製程式碼

crond不斷喚起sendmail導致資源耗盡的排查

異常程式喚醒關係梳理清楚:

init –  crond – sendmail複製程式碼
原因分析

sendmail是crond定時任務喚起的,且每分鐘增加,故檢視定時任務

重點檢視每分鐘都要執行定時任務

tail -fn 123 /var/log/cronFeb 14 19:02:01 c3-im-msg-tun002 CROND[73417]: (work) CMD (cd /home/work/bin/nt-tunnel-sgp-c3 && bin/monitor_perf.sh ./conf/nt-tunnel.config.sgp-c3.hostname -e hostname -t job=sgp-c3,service=nt-tunnel,servicegroup=common,cluster=c3,pdl=im,owt=miliao,cop=xiaomi)Feb 14 19:02:01 c3-im-msg-tun002 CROND[73418]: (work) CMD (cd /home/work/bin/nt-tunnel-sgp-c3 && bin/report_perf.sh ./conf/nt-tunnel.config.sgp-c3.hostname -e hostname -t job=sgp-c3,service=nt-tunnel,servicegroup=common,cluster=c3,pdl=im,owt=miliao,cop=xiaomi)複製程式碼

這是由god管理的定時任務

有關鍵詞了,可以查下別人的解決方案,見文末參考文獻[1].[2]。

在定時任務配置檔案中新增:mailto="",測試改為沒有效果,這個原因有待追查。

定時任務的輸出

大多數運維人員或開發人員寫CRON定時指令碼時都不考慮標準輸出和錯誤輸出如何處理。當cron的執行完有輸出或錯誤出去時,cron就會把輸出內容通過郵件傳送給當前使用者,如果本地郵件服務沒有開啟的會都會把郵件內容輸出到一個文字檔案存放到/var/spool/postfix/maildrop目錄中。開啟目錄中的檔案,其內容就是定時任務執行的輸出,見文末參考文獻[3]。

由於沒有正確處理定時任務中的輸出,這才導致伺服器資源被佔滿。

至此問題基本解決。但是由於定時任務太頻繁,會產生大量的小檔案,可能導致inode被耗盡

god的問題

由/var/log/cron得到的定時任務是由god管理的,在和開發確認job可以停掉後,執行god stop jobname。

經檢查,已經沒有程式,但是定時任務還在執行。

執行nuke後,定時任務才被清理,見文末參考文獻[4]。

確定無效的job要及時nuke。

[4]www.10tiao.com/html/666/20…

文章首發於共公眾號“小米運維”,點選檢視原文


相關文章