Linux 系統磁盤空間占滿,df 和 du 結果不一致


服務器運行一段時間后df查看磁盤剩余空間不足,通過du統計發現被幾個文件占用,遂刪除之。過了一段時間磁盤空間再次不足,通過du統計卻找不到那么多大文件。搜索后才得知原因:文件刪除后空間沒有釋放,du統計不到這部分文件;需要通過lsof排查,然后kill文件進程。以下記錄排查處理過程:

df查看分區使用情況

df(Disk Free) 以磁盤分區為單位查看文件系統,獲取硬盤被占用空間和剩余空間等信息。df 默認顯示的文件大小單位Byte;使用命令df -h,以KB,MB,GB為單位,提高可讀性。

 
顯示內容參數說明:
  • Filesystem:文件系統
  • Size: 分區大小
  • Used: 已使用容量
  • Avail: 還可以使用的容量
  • Use%: 已用百分比
  • Mounted on: 掛載點

du查看目錄占用空間

du(Disk Usage) 含義為顯示磁盤空間的使用情況,用於查看當前目錄的總大小。

 

df統計出根目錄占用30G,而du統計結果為11G(排除/mnt占用),大約19G的空間去哪兒了呢?
搜索 linux du df空間不一致 才得知原因:當有其他進程打開某文件時文件被刪除,就會將該文件標記為deleted(類似windows下的回收站狀態),並刪除其目錄節點。使用du查看時,因為沒有該刪除狀態文件的節點信息,所以就不做統計,從而導致與df的結果不一致。

使用lsof命令排查

在linux環境下,一切皆文件。lsof(LiSt Open Files)是一個查看當前系統文件的工具。
linux里的文件被刪除后,空間沒有被釋放是因為在Linux系統中,通過rm或者文件管理器刪除文件將會從文件系統的目錄結構上解除鏈接(unlink)。然而如果文件是被打開的(有一個進程正在使用),那么進程將仍然可以讀取該文件,磁盤空間也一直被占用。

通過命令 lsof |grep deleted 可以查看到狀態為deleted的文件,如下:

// 查看狀態為deleted的文件
➜ lsof |grep deleted
// 查看結果
COMMAND     PID   TID     USER   FD      TYPE             DEVICE   SIZE/OFF       NODE   NAME
dbus-daem   456           dbus  txt       REG              253,1      441144     141672 /usr/bin/dbus-daemon (deleted)
...
node      11595 11733     root  txt       REG              253,1    29851602    1461079 /home/elk/kibana-5.5.1-linux-x86_64/node/bin/node (deleted)
node      11595 11733     root    1w      REG              253,1 11374904415    1059873 /home/elk/kibana-5.5.1-linux-x86_64/nohup.out (deleted)
node      11595 11733     root    2w      REG              253,1 11374904415    1059873 /home/elk/kibana-5.5.1-linux-x86_64/nohup.out (deleted)
async_17  24113 24210 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_18  24113 24211 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_19  24113 24212 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
async_20  24113 24213 rabbitmq    1w      REG              253,1  8556707104     659069 /var/log/rabbitmq/startup_log (deleted)
...

lsof輸出各列信息的意義如下:

  • COMMAND:進程的名稱
  • PID:進程標識符
  • USER:進程所有者
  • FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等 TYPE:文件類型,如DIR、REG等
  • DEVICE:指定磁盤的名稱
  • SIZE:文件的大小(單位Byte
  • NODE:索引節點(文件在磁盤上的標識)
  • NAME:打開文件的名稱

釋放文件進程

釋放文件的方法主要有兩種:

  • kill掉相應的進程(根據PID直接kill進程)
  • 停掉使用這個文件的應用,讓os自己主動回收磁盤空間

我這個環境已經不需要這些文件,所以直接停掉進程,生產環境中要謹慎排查。再次查看空間,文件已釋放:

 
Tips:
當linux打開一個文件的時候,Linux內核會為每個進程在/proc/ 『/proc/nnnn/fd/文件夾(nnnn為pid)』建立一個以其PID為名的文件夾用來保存進程的相關信息,而其子文件夾fd保存的是該進程打開的全部文件的FD(File Descriptor)。
這是一項高級技術,僅到管理員確定不會對執行中的進程造成影響時使用。應用程序對這樣的方式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題

參考資料

博客來源:
作者:Avery_up
鏈接:https://www.jianshu.com/p/3164d1a53e34
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM