讲述下Linux 执行 df 和 du 查看磁盘时占用结果不一致的解决办法

在问答论坛上出现了这么多年,这个问题已经很常见了。
您是否知道 df 和 du 这两个命令有时会导致轻微的冲突和不一致,具体取决于磁盘使用情况。
我以前也遇到过很多次这种情况,确实很头疼。

我们先从du命令开始说起原因。
这个东西,它得一一检查文件,用fstat系统调用看看文件有多大。
数据直接来自文件,所以跨分区操作不存在问题。
你删除了很多文件,你不在乎,它仍然按照原来的文件系统目录来统计。

然后就是df命令,直接读取分区的超级块信息,也就是分区的使用情况。
该数据分段基于元数据。
您只能查看整个分区,而不能查看单个文件。

不兼容在于两者的区别。
如果删除文件,如果仍然有进程持有这些文件的句柄,则文件不会从磁盘上消失,分区的超级块信息也不会改变。
df 将继续对这些文件进行计数,但 du 不会。
这不会产生矛盾吗?
解决办法,我一般有两种:
第一种是终止相关进程。
要检查哪些文件处于删除状态,需要使用 lsof 命令。
这些是已标记为已删除但仍保留在进程中的文件。
如果执行 lsof|grep delete 您可以查看哪些进程仍在使用这些文件。
过程找到后,使用kill -9 [pid]命令将其杀死。
例如PID为6 9 2 ,则可以执行kill -9 6 9 2 这样,一旦进程终止并释放文件句柄,文件就会从磁盘上消失,分区的超级块信息也会更新,并且 df 和 du 的结果是一致的。

第二,重启服务器。
这种方法简单,但成本昂贵。
如果直接重新启动服务器,系统将退出所有现有进程,包括那些持有已删除文件句柄的进程。
但是,这会影响正在运行的服务,因此您需要找到合适的时间来执行此操作。

说实话,这两种方法我都用过,效果都还不错。
当时我不明白为什么会这样,但是查了资料才发现是这样的。
但具体操作要根据实际情况确定,权衡利弊。

linux shell中,unlink和rm命令有什么区别

rm 和 unlink 之间的主要区别是目录删除。

rm 删除文件的速度比 unlink 快 1 0-1 5 %。
unlinkat 比较灵活,可以删除空目录。
rm-rtestdir 直接删除目录,需要3 -5 秒。
Unlinkat 必须指定 AT_REMOVEDIR,这需要 2 -3 秒。

Strace显示rm调用rmdir并且unlinkat使用unlinkat。
rm 更统一地处理文件和目录。

测试环境:CentOS 7 文件大小 1 00 MB。
要删除 1 000 个文件,rm 需要 8 秒,unlinkat 需要 1 0 秒。

自己掂量一下。

从 lsof 开始,深入理解 Linux 虚拟文件系统

Linux VFS是文件操作的中转站。
如果文件被删除但进程没有终止,则空间不会被释放。

我上周处理过这个问题。
使用 lsof 您可以查看谁持有文件但尚未释放它。

硬链接是由多个名称指向的文件。
软链接是一个单独的小文件,用于存储目标路径。

删除文件时,查看i_nlink和i_count这两个数字。
只有当你达到0的时候,你才是真正的解放。

WriteBack 缓存首先将数据存储在内存中,然后再将其写入硬盘。
这会导致空间发射的延迟。

一般情况下,不建议使用WriteBack,因为很容易陷入这个陷阱。

使用lsof查找进程号,然后检查/proc//fd/中的文件描述符。

直接echo> /proc//fd/即可关闭文件。

这个机制相当复杂,但是在解决空间问题时非常实用。