最近经常收到磁盘空间不足的告警,但是去定位可删除文件的时候,发现了一个问题,df显示磁盘满了,但是du计算得到的磁盘总空间却只占到磁盘空间的50%左右。 经过查询后终于找到原因
最终原因
文件如果在被某个进程打开后删除,还会存在文件系统中,只是标记为(deleted
)状态。
df
统计是文件系统(FileSystem)中的空闲磁盘大小,这个数值可以在文件系统中直接得到,所以命令执行很快
du
统计的目录及文件占用的磁盘大小,如果文件删除(被标记为deleted
状态)则不统计
问题展示
[tenmao@vm ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 18G 72K 100% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.4M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 497M 171M 327M 35% /boot
tmpfs 182M 0 182M 0% /run/user/1000
[root@vm /]# du -h --max-depth=1
146M ./boot
0 ./dev
0 ./proc
9.4M ./run
0 ./sys
36M ./etc
44K ./root
4.0K ./tmp
344M ./var
2.6G ./usr
11G ./home
0 ./media
0 ./mnt
136M ./opt
0 ./srv
14G .
df显示磁盘占用100%(磁盘一共18G),du命令却只查找到14G的空间占用
问题定位
查看打开的文件列表
[tenmao@vm ~]$ lsof | grep deleted
less 12998 (省略) /home/tenmao/test4 (deleted)
可以看到文件/home/tenmao/test4
被进程12998打开后, 又被其他进程或命令删除,在lsof
命令中显示为deleted
状态
解决问题
停掉或重启进程12998
kill 12998
[tenmao@vm /]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 14G 4.0G 78% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.4M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 497M 171M 327M 35% /boot
tmpfs 182M 0 182M 0% /run/user/1000
停掉进程后,df命令与du命令的大小基本一致了。
一个猜测
创建文件的时候,如果df显示磁盘满,但是du显示有空间,是否可以创建文件?
结果显示:创建文件的时候,判断磁盘空间使用但是df的结果
(这也很符合预期,因为文件还是交给文件系统来管理的)