問題說明:
IDC里的一台服務器的/分區使用率爆滿了!已達到100%!經查看發現有個文件過大(80G),於是在跟有關同事確認后rm -f果斷刪除該文件。但是發現刪除該文件后,/分區的磁盤空間壓根沒有釋放出來,使用率還是100%!這是為什么呢??
[root@linux-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 58G 7.8G 47G 100% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/vda1 190M 72M 108M 40% /boot
原因分析:
在Linux或者Unix系統中,通過rm或者文件管理器刪除文件,只是將它會從文件系統的目錄結構上解除鏈接(unlink),也就是說只是刪除了文件和系統目錄結構的鏈接;如果文件在刪除時是被打開的(有一個進程正在使用該文件,文件被進程鎖定或者有進程一直在向這個文件寫數據等)狀態,那么進程將仍然可以讀取該文件,也就是說沒有刪除掉文件在讀取的狀態,所以磁盤空間也就會一直被占用。
一個文件在文件系統中的存放分為兩個部分:數據部分和指針部分,指針位於文件系統的meta-data中,數據被刪除后,這個指針就從meta-data中清除了,而數據部分存儲在磁盤中,數據對應的指針從meta-data中清除后,文件數據部分占用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除文件后,空間還沒釋放,就是因為有進程還在一直向這個文件寫入內容,導致雖然刪除了文件,但文件對應的指針部分由於進程鎖定,並未從meta-data中清除,而由於指針並未被刪除,那么系統內核就認為文件並未被刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。
解決措施有以下幾種:
1)通過lsof|grep deleted命令獲取到已經被刪除但是仍然被應用程序占用的文件列表,然后kill掉還在占用所刪除文件的進程。需要注意的是:如果有很多進程都在使用所刪除文件,那么采用第1種方式kill進程就有點麻煩了,而且風險也比較大。因為kill進程是通過截斷proc文件系統中的文件可以強制要求系統回收分配給正在使用的的文件。必須要確定不會對運行中的進程造成影響時才能使用,應用程序對這種方式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題。
2)或停掉或重啟使用這個所刪除文件的應用,讓OS自動回收磁盤空間。
3)也可以重啟操作系統,不過這並不是最好的方法
4)對待這種進程不停對文件寫日志的操作,要釋放文件占用的磁盤空間,最好的方法是在線清空這個文件。通過這種方法,磁盤空間不但可以馬上釋放,也可保障進程繼續向文件寫入日志。 在線清空文件(比如/home/wangshibo.log)的方式:
a)# echo " " > /home/wangshibo.log b)# cat /dev/null > /home/wangshibo.log c)# > /home/wangshibo.log
還有一種磁盤空間使用問題的現象:明明使用df -h命令查看磁盤空間使用率不算高,還有很多空余空間,但是創建文件或寫入數據時一直報錯磁盤寫滿:“no space left on device”! 這個參考:由索引節點(inode)爆滿引發的問題