背景
今天因为一个服务无法启动,让同事看一下,结果反馈说是磁盘空间已满,但是删除一些文件之后发现du -sh /
与df -h
结果结果相差较大。
du -sh /
[root@node1 ~]# du -sh /
du: 无法访问"/proc/24444/task/24444/fd/4": 没有那个文件或目录
du: 无法访问"/proc/24444/task/24444/fdinfo/4": 没有那个文件或目录
du: 无法访问"/proc/24444/fd/4": 没有那个文件或目录
du: 无法访问"/proc/24444/fdinfo/4": 没有那个文件或目录
14G /
df -h
[root@node1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 146G 115G 31G 78% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 65M 7.7G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 509M 138M 371M 28% /boot
tmpfs 1.6G 0 1.6G 0% /run/user/0
寻找问题
经过一番资料查询之后,是因为df
与du
统计方式的本质区别。
du统计的原理
- 如果统计目录下挂载了其他文件系统,那么也会对这个文件系统进行统计。
- 如果文件被删除,即使被其他进程引用了,du命令也无法对其统计。因为stat命令找不到这个文件。
- 可以跨分区统计某些你想统计的文件大小总和。因为它们都能被stat找到并统计。
df统计的原理
- 当某个文件系统下挂载了其他分区,df不会把这个分区也统计进去。
- 由于df每次统计都是读取superblock,所以df对文件系统中的某个文件进行统计时,会自动转为统计这个文件系统的信息。
- df会统计已删除但却仍有进程引用的文件。
对应的解决方法
通过命令查找到删除文件的引用进程。lsof | grep delete
然后通过kill
命令强制杀掉进程,然后重启即可。
然而
通过上诉的解决办法,估计有的朋友已经解决了问题,然而实际情况是:没有任何变化,问题依旧存在
。
继续寻找问题
通过上面所说的统计方式,猜测是因为文件在删除之后仅仅是对元信息做对应的标识,但是对应的存储块并未被正确的回收,而对于元信息等操作,也不敢随意的进行操作,经过一番资料查询之后,想到一个方式,就是进行磁盘碎片整理,这个过程中必然涉及到数据块的移动,自然也会重新整理对应的元信息,这样统计的数值将会一致。
解决步骤
-
查询对应的文件格式
[root@node1 ~]# df -hT 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 146G 115G 31G 78% / devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs tmpfs 7.8G 65M 7.7G 1% /run tmpfs tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/sda1 xfs 509M 138M 371M 28% /boot tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/0
由于系统格式为:xfs, 与之对应的命令为
xfs_fsr
-
寻找对应的磁盘整理命令
[root@node1 /]# xfs_fsr xfs_fsr -m /proc/mounts -t 7200 -f /var/tmp/.fsrlast_xfs ... / start inode=0 XFS_IOC_SWAPEXT failed: ino=2049842: 无效的参数 XFS_IOC_SWAPEXT failed: ino=21294309: 无效的参数 XFS_IOC_SWAPEXT failed: ino=139821787: 无效的参数 XFS_IOC_SWAPEXT failed: ino=269848148: 无效的参数 /boot start inode=0 Completed all 10 passes
-
确认问题是否解决
[root@node1 ~]# df -hT 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 146G 14G 133G 10% / devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs tmpfs 7.8G 65M 7.7G 1% /run tmpfs tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/sda1 xfs 509M 138M 371M 28% /boot tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/