linux df -h顯示空間信息不正確

原文鏈接:https://www.cnblogs.com/longchang/p/10768111.html

轉載於:https://www.cnblogs.com/longchang/p/10768111.html

 

在linux系統上有時發現使用df 查看磁盤已使用空間和使用du統計的不相等,例如:

[running]root@slave11:/$ df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1             9.9G  4.0G  5.4G  43% /

/dev/sda3              20G  1.4G   18G   8% /usr/local

/dev/sda4             244G  215G   17G  93% /data

tmpfs                  32G   52K   32G   1% /dev/shm

/dev/sdb1             9.9G  151M  9.2G   2% /data1

 

[running]root@slave11:/data$ du -sh

182G    .

 

從這裏面可以看出通過du看到使用了182G,但是通過df 看,/data目錄已使用215G,這是什麼原因呢?

 

先講du和df原理

 

du的工作原理

du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,所以有很大的靈活性,不一定非要針對一個分區,可以跨越多個分區操作。如果針對的目錄中文件很多,du速度就會很慢了。

 

df命令使用的事statfs這個系統調用,直接讀取分區的超級塊信息獲取分區使用情況。它的數據是基於分區元數據的,所以只能針對整個分區。由於df直接讀取超級塊,所以運行速度不受文件多少影響。

 

 

原因有兩個:

1、硬盤本來有保留空間,可以通過tune2fs -r 40000 /dev/sda4進行設置

 

2、已經被刪掉的文件還有程序在佔用,所以文件沒被真正釋放

 

針對第二種原因,可以通過如下步驟驗證查看及釋放空間

 

1、lsof |grep deleted > deleted_file查看有哪些未被釋放的文件

 

2、排序看最大的未被釋放的文件大小,命令:sort -nr -k 7 deleted_file>sort_deleted_file

 

3、more sort_deleted_file 查看前面那些文件,將佔用空間大的程序kill掉

kill 進程號

實例:

➜  pydata df -h
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/cluster_vg-cluster_lv   12G   11G  1.9G  85% /home/pydata

➜  pydata lsof |grep deleted
rpc.mount 17821            root    6r      REG              253,0           0  100949767 /var/lib/nfs/etab.tmp (deleted)
smbd      20496            root  cwd       DIR              253,3        3864    1684953 /home/pydata/pandx (deleted)
smbd      20496            root   10u      REG              253,3 10737418240    1684988 /home/pydata/pandx/vdb.1_1.dir/vdb_f0001.file (deleted)

 

➜  pydata kill -9 20496

➜  pydata kill -9 17821

➜  pydata df -h
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/cluster_vg-cluster_lv   12G  137M   12G   2% /home/pydata

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