服務器運行一段時間后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自己主動回收磁盤空間
我這個環境已經不需要這些文件,所以直接停掉進程,生產環境中要謹慎排查。再次查看空間,文件已釋放:
當linux打開一個文件的時候,Linux內核會為每個進程在/proc/ 『/proc/nnnn/fd/文件夾(nnnn為pid)』建立一個以其PID為名的文件夾用來保存進程的相關信息,而其子文件夾fd保存的是該進程打開的全部文件的FD(File Descriptor)。
這是一項高級技術,僅到管理員確定不會對執行中的進程造成影響時使用。應用程序對這樣的方式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題
參考資料
作者:Avery_up
鏈接:https://www.jianshu.com/p/3164d1a53e34
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
