df -h和du -sh看到的硬盘使用不相等?

时间:2022-07-22
本文章向大家介绍df -h和du -sh看到的硬盘使用不相等?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

笔者最近做一些DLPNO-CCSD(T)的计算,比较耗硬盘,就对硬盘的空间比较敏感。无意中发现有一块硬盘用df -h命令查看,始终占了比较大的空间。删掉了一些文件后,还是剩余空间不多。但是用du -sh命令看硬盘的使用空间时却没有那么大。具体情况如下图所示:

/scratch分区在df -h命令下显示使用了622G的空间,而用du -sh则显示只用了277G的空间。

在网上找了一下df和du的区别,一个通俗易懂的说法如下(此处直接当一名搬运工):

du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。它计算的大小就是当前它认为存在的所有文件大小的累加和。

df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件, df记录的是通过文件系统获取到的文件的大小,它比du强的地方就是能够看到已经删除的文件,而且计算大小的时候,把这一部分的空间也加上了,更精确了。当文件系统也确定删除了该文件后,这时候du与df就一致了。

版权声明:以上两段文字摘自CSDN博主「wisgood」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/wisgood/java/article/details/17316663

有了以上原理分析就清楚了,df可能会统计一些被用户删了,但没有真正消失的文件,因此看到的空间比du看到的使用空间更大。解决方法如下:

1. 用lsof命令列出被程序所打开的文件文件名,并筛选出被删除的文件:

lsof | grep deleted > deleted_file

2. 将文件按从大到小排序:

sort -nr -k 7 deleted_file > deleted_file_sorted

3. 打开deleted_file_sorted文件,从上往下依次找,就可以看到一些被删除但是没有释放的文件,以及占用这些文件的程序。

笔者确实看到了一些被删掉的临时文件,所占空间也很大。不过top之后却看不到相关的进程,因为top看到的是当前用户和系统的一些活跃进程,那些僵尸进程可能就显示不出来了。笔者的解决办法是用top -u zhigang (zhigang为笔者的用户名),仅查看本用户的进程,就可以看到了,然后kill掉进程,文件就被释放了。