问题描述:根下磁盘占用94%,但是通过df -hiT 磁盘的inode正常,du命令的显示结果也为正常。
这里先简单说说inode与磁盘空间的关系:
- Inode(索引节点):
在Unix/Linux文件系统中,每个文件和目录都有一个对应的inode。Inode是文件系统中的数据结构,它包含了文件或目录的元数据信息,但并不包含文件的实际数据内容。元数据包括文件的权限、所有者、文件类型、访问时间、修改时间、文件大小等信息。
每个文件系统有一个限制的inode数量,这个限制在文件系统创建时就确定了,所以它决定了文件系统能够存储的文件和目录的数量。当文件系统中的所有inode都被用完后,就无法再创建新的文件或目录,尽管磁盘空间可能还有剩余。
- 磁盘空间与Inode的关系:
磁盘空间主要是指文件和目录实际占用的存储空间,而inode用于跟踪文件和目录的元数据。当你在磁盘上创建文件或目录时,会消耗一个inode来存储元数据,同时也会消耗相应的磁盘空间来存储文件的实际内容。
通常情况下,一个普通文件会占用一个inode和一些磁盘空间,而一个目录也会占用一个inode和一小部分磁盘空间。但是需要注意的是,硬链接和软链接也会消耗inode,因为它们也是文件系统中的实体,只是指向了其他文件的inode。
综上所述,磁盘空间和inode使用率都是管理文件系统时需要注意的重要指标。如果你的文件系统中有大量小文件,可能会导致inode用完而无法创建新文件,即使磁盘空间还有剩余。因此,对于大量小文件的情况,你可能需要考虑调整文件系统的inode限制或者合并一些小文件,以便更好地利用文件系统的资源。
我的一种想法是该文件系统中含有过多的大文件,而每个文件都会占用一个inode,这样会出现磁盘占用高而inode占用低的情况。
另一种是因为磁盘上有一些被删除但仍被进程占用的文件,这些文件占用了磁盘空间但在文件系统统计中没有被计算在内。这种情况通常被称为"deleted but still open",即被删除但仍处于打开状态。
可以尝试使用lsof命令来查找这些被删除但仍在打开状态的文件。lsof 可以列出当前系统中打开的文件,包括被删除但仍在被进程使用的文件。记住lsof非常有用
执行以下命令查找是否有这类文件:
sudo lsof | grep deleted
如果找到这些文件,它们的路径可能会显示为(deleted)或者FD(File Descriptor)后面带有"deleted"字样。这些文件被进程占用,但在文件系统中已经不存在,所以du命令无法统计它们的磁盘占用。
解决此问题的常见方法是重启占用这些文件的进程。重启进程会释放被删除文件的文件句柄,从而释放磁盘空间。但请在执行此操作前确保重启进程不会对系统产生负面影响。
具体操作为(每台服务器不同可能的细微操作不同):
for i in `lsof | grep "deleted" | awk '{print $2}' | uniq`;
> do
> kill -15 $i
> done
在这里我再说说kill -15与kill -9:
kill -15和 kill -9 是两种不同的信号,用于向进程发送终止信号。它们在终止进程时有不同的影响:
-
kill -15 : 这是一个优雅的终止信号,它告诉进程要求它自行终止。进程在收到 SIGTERM 信号时,可以执行一些清理操作,保存数据等,然后自行正常退出。这种终止方式允许进程有机会做一些善后工作,确保数据的完整性,并释放系统资源。
优点:
- 允许进程自行处理退出过程,执行清理操作。
- 较少引起数据损失或不一致性。
- 可以给予进程完成未完成的操作的机会。
缺点:
- 可能需要等待一段时间,直到进程完成退出过程。
-
kill -9 : 这是一个强制终止信号,它会立即终止进程,不给进程任何处理终止过程的机会。进程收到 SIGKILL 信号后,将立即终止,没有任何机会进行清理或保存数据。这是一种非常强制的方式。
优点:
- 确保进程立即终止,不会占用系统资源。
- 强制终止进程,不需要等待。
缺点:
- 可能导致数据丢失或不一致性。
- 不允许进程做任何清理或善后操作。