1. 程式人生 > >由ftp傳輸腳本引發的服務器內存問題

由ftp傳輸腳本引發的服務器內存問題

ftp crontab process

由於近期不斷收到告警郵件,提示某服務器的內存使用率已經超過90%,便去查看zabbix監控,通過監控圖,發現內存使用率是呈上漲趨勢的,如此下去,內存枯竭是必然的事。並且,這種持續上漲的問題,通過增加內存並不是根本的解決方法,於是,就有了下面的探索之旅。
監控如圖所示:
技術分享圖片


首先,登錄服務器,使用 “top” 命令查看當前較為占用內存的進程,發現排在前十的進程所占用的總內存也只有50%左右。於是,又通過 “ps aux” 命令查看所有進程,發現存在大量重復的進程,就是ftp進程,統計了一下,大約有3000多條,我想,這應該就是導致內存使用率持續升高的原因了。
技術分享圖片

ftp是由crontab定時運行的,每15分鐘執行一次傳輸任務,所以會產生這麽多進程也不奇怪。問題是,為什麽傳輸完成後進程也不會結束呢?難道ftp會話一直沒有關閉嗎?於是,手動執行ftp傳輸腳本,使用調試模式進行觀察,發現腳本運行過程中果然出現問題了 "passive mode refused" 。

            問題截圖如下:

技術分享圖片

先使用如下命令把有關ftp的進程全部殺掉,然後觀察內存使用情況,發現內存使用率馬上就降下來了:

for i inps aux |grep "ftp -n" |grep -v grep |awk ‘{ print $2 }‘; do kill -9 $i; done

技術分享圖片

現在要解決的問題就是怎麽才能讓ftp進程在傳輸完成後正常結束,再次模擬了一下,確認了問題點:
技術分享圖片

問題提示為"passive mode refused",ftp分為兩種傳輸模式,主動模式和被動模式,ftp默認使用被動模式。聯想到前段時間ftp服務端做了嚴格的端口訪問限制,應該是只放通了21端口。因為ftp被動模式需要服務端也提供一個隨機端口給客戶端訪問,用以數據傳輸,所以現在ftp可以建立連接,但是不能進行數據傳輸。既然如此,將被動模式改為主動模式試一下:

技術分享圖片
技術分享圖片

腳本執行過程中,提示ftp被動模式關閉,然後文件能正常傳輸,在整個腳本執行完後,再查看進程,沒有發現殘留的ftp進程。如此,也可以推斷,ftp服務端是開啟了20和21端口給客戶端服務器訪問。
至此,問題解決,後續將持續觀察。

由ftp傳輸腳本引發的服務器內存問題