查找了下發(fā)現(xiàn)系統(tǒng)對rm進行了alias ,,因為Linux對刪除操作沒有回收站機制,,對rm操作進行了自定義,對刪除文件進行移動到/tmp 目錄里面,。
又對/temp刪除 但是還是沒有發(fā)現(xiàn)磁盤沖擊釋放
執(zhí)行 lsof | grep deleted發(fā)現(xiàn)有大量剛剛刪除文件的進程存在,,kill掉進程(或者重啟進程) OK
參考資料
運維實戰(zhàn)案例之文件已刪除但空間不釋放問題解析
1,、錯誤現(xiàn)象
運維的監(jiān)控系統(tǒng)發(fā)來通知,,報告一臺服務器空間滿了,登陸服務器查看,,根分區(qū)確實沒有空間了,,如下圖所示:
這里首先說明一下服務器的一些刪除策略,由于Linux沒有回收站功能,,我們的線上服務器所有要刪除的文件都會首先移動到系統(tǒng)/tmp目錄下,,然后定期清除/tmp目錄下的數(shù)據(jù)。這個策略本身沒有問題,,但是通過檢查發(fā)現(xiàn)這臺服務器的系統(tǒng)分區(qū)中并沒有單獨劃分/tmp分區(qū),,這樣/tmp下的數(shù)據(jù)其實是占用了根分區(qū)的空間。既然找到了問題,,那么刪除/tmp目錄下一些大數(shù)據(jù)即可,,執(zhí)行如下命令,檢查/tmp下最大的三個數(shù)據(jù)文件,,如下圖所示:
1
2
3
4
|
[root@localhost~ ]# du -s /tmp/*|sort -nr|head -3
69206016 /tmp/access_log
36 /tmp/hsperfdata_root
36 /tmp/hsperfdata_mapred
|
通過命令輸出發(fā)現(xiàn)在/tmp目錄下有個66G大小的文件access_log,,這個文件應該是apache產(chǎn)生的訪問日志文件,從日志大小來看,,應該是很久沒有清理apache日志文件了,,基本判定是這個文件導致的根空間爆滿,在確認此文件可以刪除后,,執(zhí)行如下刪除操作:
[root@localhost ~]# rm /tmp/access_log
接著查看系統(tǒng)根分區(qū)空間是否釋放,,如下圖所示:
從輸出可以看到,根分區(qū)空間仍然沒有釋放,,這是怎么回事,?
2、解決思路
一般說來不會出現(xiàn)刪除文件后空間不釋放的情況,,但是也存在例外,,比如文件被進程鎖定,,或者有進程一直在向這個文件寫數(shù)據(jù)等等,要理解這個問題,,就需要知道Linux下文件的存儲機制和存儲結構,。
一個文件在文件系統(tǒng)中的存放分為兩個部分:數(shù)據(jù)部分和指針部分,指針位于文件系統(tǒng)的meta-data中,,數(shù)據(jù)被刪除后,,這個指針就從meta-data中清除了,而數(shù)據(jù)部分存儲在磁盤中,,數(shù)據(jù)對應的指針從meta-data中清除后,,文件數(shù)據(jù)部分占用的空間就可以被覆蓋并寫入新的內(nèi)容,之所以出現(xiàn)刪除access_log文件后,,空間還沒釋放,,就是因為httpd進程還在一直向這個文件寫入內(nèi)容,導致雖然刪除了access_log文件,,但文件對應的指針部分由于進程鎖定,,并未從meta-data中清除,而由于指針并未被刪除,,那么系統(tǒng)內(nèi)核就認為文件并未被刪除,,因此通過df命令查詢空間并未釋放也就不足為奇了。
3,、問題排查
既然有了解決問題的思路,,那么接下來看看是否有進程一直在向acess.log文件中寫數(shù)據(jù),這里需要用到Linux下的lsof命令,,通過這個命令可以獲取一個已經(jīng)被刪除但仍然被應用程序占用的文件列表,,命令執(zhí)行如下圖所示:
從輸出結果可以看到,/tmp/acess.log文件被進程httpd鎖定,,而httpd進程還一直向這個文件寫入日志數(shù)據(jù),,從第七列可知,這個日志文件大小僅70G,,而系統(tǒng)根分區(qū)總大小才100G,,由此可知,這個文件就是導致系統(tǒng)根分區(qū)空間耗盡的罪魁禍首,,在最后一列的“deleted”狀態(tài),,說明這個日志文件已經(jīng)被刪除,但由于進程還在一直向此文件寫入數(shù)據(jù),,空間并未釋放,。
4、解決問題
到這里問題就基本排查清楚了,解決這一類問題的方法有很多種,,最簡單的方法是關閉或者重啟httpd進程,,當然也可以重啟操作系統(tǒng),不過這并不是最好的方法,,對待這種進程不停對文件寫日志的操作,,要釋放文件占用的磁盤空間,最好的方法是在線清空這個文件,,可以通過如下命令完成:
[root@localhost ~]# echo " " >/tmp/acess.log
通過這種方法,,磁盤空間不但可以馬上釋放,也可保障進程繼續(xù)向文件寫入日志,,這種方法經(jīng)常用于在線清理Apache,、Tomcat、Nginx等Web服務產(chǎn)生的日志文件,。
http://ixdba.blog.51cto.com/2895551/1435781