本实验结果是在RHEL6.4-64bit下得出
du 命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
df 命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
常见的df和du不一致情况就是文件被删除的而进程句柄还在导致的问题。当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,这样df仍旧会统计这个被删除了的文件。
首先查看磁盘和路径
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]#
[root@zhjk115 app]# pwd
/app
用 dd 命令创建 1G 大学的文件
[root@zhjk115 app]# dd if=/dev/zero of=/app/test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.31891 s, 243 MB/s
查看 df 和 du 结果,目前是一致的
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
43G
模拟进程在使用 test.iso 文件
[root@zhjk115 app]# tail -f test.iso &
[1] 22349
[root@zhjk115 app]# ps -ef |grep tail
root 22349 21633 28 09:56 pts/1 00:00:01 tail -f test.iso
root 22353 21633 0 09:56 pts/1 00:00:00 grep tail
删除 test.iso 文件, 可以看出 df 和 du 的结果是不一致的
[root@zhjk115 app]# rm -rf test.iso
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
42G
用 lsof 查看哪个进程在使用 /app/test.iso
[root@zhjk115 app]# lsof |grep test.iso
tail 22349 root 3r REG 253,2 1048576000 12 /app/test.iso
手动 kill 占有 test.iso 文件的进程,此时, du 和 df 的结果一致
[root@zhjk115 app]# kill -9 22349
[1]+ Killed tail -f test.iso
[root@zhjk115 app]# du -sh
42G
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
结论:
本实验主要是针对Linux环境的使用,该问题是由于进程的文件句柄释放问题导致的,很多情况为清理完日志等文件是du显示为已释放空间,但df空间还在使用,此时可以通过echo(或者>)代替rm来避免这种情况,同时也可以查看是哪个进程在使用,可以根据情况手动清理、重启应用或者等待释放。
注:当oracle主机某些日志被清理后但df显示空间没有被释放也是同样的道理,一般来说等一段时间即可,否则需要重启数据库实例来释放空间。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26964624/viewspace-2564207/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26964624/viewspace-2564207/