问题描述:
在k8s 环境中,新创建的pod在某一节点被驱逐,查看log,显示磁盘压力
Warning Evicted 3m26s kubelet The node had condition: [DiskPressure]
df 查看结果如下
$ df -ah /
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 118G 109G 2.7G 98% /
du 查看结果如下
$ du -ah
...
25G /
排查思路
-
挂载点的考量: df -ah会显示整个文件系统的使用情况,包括所有直接挂载在当前目录下的子文件系统。这意味着,如果你在根目录(/)下运行df -ah,它会计算根目录下所有挂载点的总和,包括如/home、/var等独立分区的使用情况。
而du -ah则递归遍历当前目录下的所有文件和子目录,计算它们占用的空间,但不会深入到其他挂载点的内部。换句话说,du不会跨过挂载点去统计其他文件系统的使用情况。 -
隐藏文件和目录: du -ah包含了所有文件和目录(包括隐藏的,即以.开头的文件或目录)的大小,确保了统计的完整性。
如果没有使用-a选项,du默认可能忽略了一些隐藏的大型文件或目录,而这些在df的统计中依然会被计算。 -
文件系统元数据和预留空间: df报告的已用空间可能包括了文件系统的元数据(如
inode
信息)占用的空间,以及文件系统可能预留的部分空间。
du则主要关注实际文件和目录占用的空间,可能不包括上述元数据和预留空间。 -
已删除文件和打开文件描述符: 如果有文件被删除但仍有进程保持其打开,这部分空间在du统计时可能不会体现,因为du不考虑已删除但未被释放的文件空间,而df则会计入这些空间。
-
缓存和缓冲区: df显示的已用空间可能包括了操作系统用于缓存和缓冲的磁盘空间,这部分空间在需要时可被快速释放,但du统计时通常不包括这些临时缓存。
-
统计误差或不一致性: 极少数情况下,文件系统损坏或统计不一致可能导致df和du的结果差异,需要检查文件系统的健康状况。
为缩小这种差异,你可以:
- 确认是否有额外的挂载点导致的统计差异。
- 使用lsof命令检查是否有进程持有已删除文件的句柄。
- 运行sync命令刷新文件系统缓存,然后再次检查。
- 检查是否有大量的小文件未被正确统计(du在处理大量小文件时可能会有性能问题)。
- 如有必要,使用fsck检查并修复文件系统。
解决办法
首先当前目录下没有其他挂载点,所以使用lsof 检查是否有进程持有已删除的句柄:
lsof -w -n -r1 | grep '(deleted)'# -w选项表示不警告无法stat的文件
# -n避免解析主机名,提高输出速度
# -r1告诉lsof每秒重复执行一次(直到你中断它),这有助于捕捉瞬时情况
发现大量已删除句柄,终止这些进程,磁盘空间恢复正常。
du和df差异总结
df (disk free)
-
原理:
df命令主要通过读取文件系统层次标准(Filesystem Hierarchy Standard, FHS)规定的/proc/mounts
文件或者直接查询内核的mount信息来获取各个文件系统的磁盘使用情况。它显示的是整个文件系统级别的磁盘使用概况,包括总的容量、已用空间、可用空间以及挂载点。这意味着df告诉你的是整个分区或挂载点的使用情况,包括未分配给任何文件的剩余空间。 -
特点:
- 关注整体:提供文件系统的总览,包括挂载点、总大小、已用空间、可用空间和使用百分比。
- 快速:因为它直接从系统内部读取信息,而不需要遍历文件系统,因此执行速度较快。
- 不考虑文件:不显示单个文件或目录的大小。
du (disk usage)
-
原理:du命令则是通过递归遍历指定目录(或当前目录,如果不指定的话)及其所有子目录和文件,计算并汇总它们各自占用的磁盘空间大小。这意味着du提供的是更细粒度的磁盘使用信息,它直接基于文件和目录的实际大小来计算。
-
特点:
- 细致入微:能够显示每个目录和文件的磁盘使用量,适合于查找占用空间较大的文件或目录。
- 慢速:相较于df,du需要遍历文件系统,因此在大型文件系统或深度嵌套的目录结构中执行速度较慢。
- 可以配合选项使用,如-h使输出更易读,-s只显示总计,-a显示所有文件,包括隐藏文件。
差异比较
- 关注点不同:df关注的是整个文件系统或分区的使用情况,而du则专注于特定目录或文件的磁盘使用细节。
- 信息来源不同:df从系统内部直接获取信息,速度快;du通过实际遍历文件系统,速度相对较慢但信息更具体。
- 使用场景不同:当你需要了解整个磁盘或分区的概览时,使用df;而当你需要找出具体是哪些文件或目录占用了大量空间时,应该使用du。
文件删除的理解
当一个文件被删除时,它的磁盘空间被视为可用,文件系统的目录项(即文件名和相关元数据的记录)被标记为可重用。然而,如果有一个或多个进程仍然保持着该文件的打开句柄,那么该文件的内容实际上并未立即从磁盘上清除。这些内容会一直保留,直到最后一个引用该文件的进程关闭句柄。在此期间,这些文件的数据块虽然标记为可覆盖,但如果没有新的数据写入,它们依然会占据物理磁盘空间。
inode 学习
在Linux文件系统中,inode(索引节点)是核心概念之一,它扮演着文件系统元数据存储库的角色。每个文件或目录在Linux的文件系统中都有一个对应的inode,包含了该文件或目录的关键属性信息,但不包括文件名和实际数据内容。以下是inode的几个关键特征和作用:
元数据存储
inode存储了文件或目录的元数据信息,包括但不限于:
- 权限:读、写、执行权限等。
- 所有权:属主和所属组的信息。
- 时间戳:创建时间、最后修改时间和最后访问时间。
- 大小:文件的大小(以字节为单位)。
- 链接计数:指向该inode的硬链接数量。
- 数据块指针:指向文件内容所在的磁盘块的指针。对于大文件,可能有间接块指针。
索引节点号
每个inode都有一个唯一的数字标识符,称为inode号码(inode number)。在Linux中,可以通过ls -i
命令查看文件或目录的inode号码。
文件系统结构
在Linux文件系统中,文件名和inode号码之间存在一个层次结构的目录项表。当访问文件时,系统首先通过文件名找到对应的目录项,进而获取inode号码,再通过inode号码访问到实际的inode和文件数据。
硬链接与软链接
- 硬链接:创建硬链接实际上是在文件系统中创建了新的目录项,指向同一个inode。因此,硬链接文件和原文件共享相同的inode和数据块,修改任一文件的内容都会影响另一个。
- 软链接(符号链接):软链接则是一个包含目标文件路径名的新文件,有自己的inode和数据块,它只是指向另一个文件的路径名。
inode耗尽问题
由于inode是有限资源,每个文件系统在创建时会分配固定数量的inode。当大量小文件填满inode空间,即使磁盘空间充足,也可能出现无法创建新文件的问题,这被称为inode耗尽。
参考文档
1、https://www.cnblogs.com/tian874540961/p/12024744.html
2、https://www.cnblogs.com/ToTigerMountain/articles/17568487.html