问题描述:
一直在报 IOError: [Errno 28] No space left on device
内存不足的错误,用df查看查看使用率是100%,但是用du检查发现还有7G的内存。所以一直在好奇为什么 df du差别这么大,我电脑消失的7个G去哪了呢?
>> df -h
> Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 50G 14M 100% /
>> sudo du -x -h --max-depth=1
> 43G
大概了解了一下du和df的区别:
- du: disk usage 磁盘空间,是文件夹里所有文件大小叠加在一起计算的。
- df: disk free 磁盘空闲空间,是通过统计磁盘中空闲计算的。
解决方案:
1)最常见的df和du结果不一样是因为文件删除的问题。一个文件被删除后,就已经不在文件系统目录中了,所以du就不会再统计它。但是如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会在磁盘中真正被删除。这样df仍旧会统计这个被删除了的文件,就会产生df du 结果不一样的问题。
这种情况的解决办法是用lsof | grep deleted
查找这样的进程,然后kill掉这些进程。
但是我测试了一下我的问题不是由于删除文件的问题导致的所有就又查到了另一种情况。
2)/mount节点的问题,文件虽然是挂载在硬盘上的,但是实际上还是会往磁盘上存储一些,这种情况du不会计算在内,所以我尝试了用sudo umount -v
解除了磁盘上所有挂载的盘,发现并没有多余的文件。
3)最后发现了清理磁盘碎片的问题
查看碎片情况:
>> xfs_db -c frag -r / # 不知道为啥我执行这步一直在报错
> xfs_db: can't determine device size
>> xfs_db -c frag -r /dev/mapper/centos-root #这样为正常查询
> actual 354555, ideal 352996, fragmentation factor 0.44%
> Note, this number is largely meaningless.
> Files on this filesystem average 1.00 extents per file
整理碎片(需要一定的空余空间):
>> sudo xfs_fsr /
>/ start inode=0
清理完碎片,df du 不一样的问题就解决啦~ 电脑多出了7个G,美滋滋!