Linux磁盤空間被未知資源耗盡

誰動了我的磁盤:Linux磁盤空間被未知資源耗盡

轉至:higkoo

    最近跑一穩定性測試,爲防止日誌過多塞滿磁盤。特將程序日誌指向空設備(/dev/null),不實際寫磁盤。

    結果一晚上過去了,磁盤還是快爆了,而且日誌文件是空的!

    使用df -hlT查看磁盤剩餘空間,所剩無幾:

[higkoo@TestServer ~]# df -hlT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext3 20G 6.6G 12G 36% /
/dev/sda2 xfs 115G 103G 13G 89% /data
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm

   而使用du -sh查看該分區磁盤佔用量僅13G:

[higkoo@TestServer ~]# du -sh /data/
13G /data/

    使用find也無法找到較大的文件,誰吃了我的磁盤空間呢?

    想起昨晚的一個刪除操作:先刪除日誌文件,然後將日誌指向(ln -s logfile /dev/null)空設備而沒有重啓服務。頓時恍然大悟

    立馬停止服務(killall -15 nginx)再查看磁盤,空間成功釋放。

    產生這個問題的根本原因是:文件確實是從文件系統中刪除了,但沒有從磁盤上刪除

    之所以誤刪除可以被找回來,也是同樣的道理(注意: rm -rf / 和 rm -rf ./)。上文進程在寫文件時,文件被刪除。而進程還在繼續向文件地址後擦寫數據,導致仍然佔用磁盤空間。由於進程正在操作磁盤,待進程退出後操作才能被更新。所以,在刪除文件前先看一下有誰正在讀寫。

    要重現這個現象非常容易,如下操作:

[higkoo@TestServer ~]# df -hlT
Filesystem    Type    Size Used Avail Use% Mounted on
/dev/sda1     ext3     20G 6.6G   12G 36% /
/dev/sda2      xfs    115G   13G 103G 11% /data
tmpfs        tmpfs    2.0G     0 2.0G   0% /dev/shm
[higkoo@TestServer ~]# du -sh /data/
13G /data/
[higkoo@TestServer ~]# rm /data/filetest # 刪除後約一分鐘後執行下面的命令
[higkoo@TestServer ~]# du -sh /data/
13G /data/
[higkoo@TestServer ~]# df -hlT
Filesystem    Type    Size Used Avail Use% Mounted on
/dev/sda1     ext3     20G 6.6G   12G 36% /
/dev/sda2      xfs    115G   33G   83G 29% /data
tmpfs        tmpfs    2.0G     0 2.0G   0% /dev/shm

    如何跟蹤這類問題呢?答案:

lsof -n | grep deleted
COMMAND     PID      USER   FD      TYPE             DEVICE        SIZE       NODE NAME
dd        31708      higkoo    1w      REG                8,2 5523705856     429590 /data/filetest (deleted)

     命令打lsof -n | grep deleted印出所有針對已刪除文件的讀寫操作,這類操作是無效的,也正是磁盤空間莫名消失的根本原因!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章