IDC里的一臺服務器的/磁區使用率爆滿了!已達到100%!經查看發現有個檔案過大(80G),于是在跟有關同事確認后rm -f果斷洗掉該檔案,但是發現洗掉該檔案后,/磁區的磁盤空間壓根沒有釋放出來,使用率還是100%!這是為什么呢??

[root@linux-node1 ~]# df -hFilesystem 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系統中,通過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.logb)# cat /dev/null > /home/wangshibo.logc)# > /home/wangshibo.log
還有一種磁盤空間使用問題的現象:明明使用df -h命令查看磁盤空間使用率不算高,還有很多空余空間,但是創建檔案或寫入資料時一直報錯磁盤寫滿:" no space left on device"!
一般這種問題都是由于磁區目錄下deleted洗掉后的資源空間沒有真正釋放出來導致的, 具體處理流程如下:
1.先df -lh查看一下磁盤使用狀況, 發現/data磁區下的Used已用空間很大, 但是實際查看并沒有占用那么大的空間!2.找到被洗掉檔案所在的磁區, 比如/data磁區3.查看被洗掉了的所有檔案:lsof -n /data |grep deleted4.殺死這些檔案的delete行程, 釋放空間: lsof -n /data |grep deleted|awk '{print $2}'|xargs kill -95.接著再運行lsof -n /data |grep delete,應該就沒有結果了,6.注意: 剛殺死deleted行程時, df -h查看/data 磁區, Used已用空間可能時瞬間顯示過大, 但隨著deleted行程殺死, 資源逐漸釋放, /data磁區下的Used已用空間會逐漸變小, Avail可用空間會逐漸變大)
大多數檔案系統都會保留一部分空間留作緊急情況時用(比如硬碟空間滿了),這樣能保證有些關鍵應用(比如資料庫)在硬碟滿的時候有點余地,不致于馬上就 crash,給監控系統和管理員一點時間去察覺,不過有時候這部分預留的硬碟空間不用的話有點浪費,
在Linux系統中,ext2、ext3、ext4檔案系統上通常會默認預留5%的磁盤空間,比如磁盤如果是2TB,這就意味著有100GB的空間會被預留下來,這樣的話會不會顯得有點浪費了,可以通過"tune2fs"命令來改變5%的默認設定,比如只預留2%的空間,但是不建議設成0%,現實環境中這樣做不安全,
[root@ss-server ~]# df -TFilesystem Type 1K-blocks Used Available Use% Mounted on/dev/vda1 ext4 41151808 4962148 34076228 13% /devtmpfs devtmpfs 1931468 0 1931468 0% /devtmpfs tmpfs 1941204 0 1941204 0% /dev/shmtmpfs tmpfs 1941204 652 1940552 1% /runtmpfs tmpfs 1941204 0 1941204 0% /sys/fs/cgrouptmpfs tmpfs 388244 0 388244 0% /run/user/0[root@ss-server ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 40G 4.8G 33G 13% /devtmpfs 1.9G 0 1.9G 0% /devtmpfs 1.9G 0 1.9G 0% /dev/shmtmpfs 1.9G 620K 1.9G 1% /runtmpfs 1.9G 0 1.9G 0% /sys/fs/cgrouptmpfs 380M 0 380M 0% /run/user/0
比如上面"/"磁區是ext4檔案系統,默認系統預留了5%也就是2G的空間,現在可以通過"tune2fs"命令將系統預留空間改為2%,
[root@ss-server ~]# tune2fs -m 2 /dev/vda1tune2fs 1.42.9 (28-Dec-2013)Setting reserved blocks percentage to 2% (209704 blocks)
執行后,發現"/"磁區騰出了1G的空間,這時系統預留空間也就是2%了,
[root@ss-server ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 40G 4.8G 34G 13% /devtmpfs 1.9G 0 1.9G 0% /devtmpfs 1.9G 0 1.9G 0% /dev/shmtmpfs 1.9G 620K 1.9G 1% /runtmpfs 1.9G 0 1.9G 0% /sys/fs/cgrouptmpfs 380M 0 380M 0% /run/user/0
以上就是良許教程網為各位朋友分享的Linux磁盤空間釋放問題,
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/254254.html
標籤:Linux
