du与df查看已使用空间不一致的原因及解决方法
在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 进程号
注:lsof以root执行才能查全,lsof使用说明:
http://daizj.iteye.com/blog/2295148