在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