linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?

我们在使用磁盘统计的时候,经常用到df和度命令, 但是很多时候都发现不太一致.其实主要分下面两类情况

一、僵尸进程

通过top命令可以统计僵尸进程:

image.png

也可以通过以下命令进行操作

ps -ef | grep defunct | grep -v grep | wc -l

如果发现有的话,可以清理一波,用如下命令:

ps -e -o ppid,stat | grep Z | cut -d '' -f2 | xargs kill -9

注意: 僵尸进程一次不一定能被清理干净,可以多清理几次.

二、删除的文件被进程占用

df 统计的时候是从文件系统考虑的,不仅包含文件系统大小,还要统计被命令或者程序占用的空间,

例如 文件已经被删除,但是被某个进程持有。其原理是读取每个分区的superblock来获取空闲数据块、已使用数据块,从而计算出空闲空间和已使用空间,因此df统计的速度极快(superblock才占用1024字节)。所以非常快。

既然文件已经被删除了为何还不释放呢? 文件已经被删除,但是被某个进程持有。这种情况就不会释放。

如何查找出这些僵尸文件呢?

lsof |grep deleted

找到的结果就是一些文件已经被删除,但是空间还没有释放的。可以很久实际情况将持有的改文件的PID kill掉来释放空间。

可以使用如下命令批量删除。 生产环境谨慎操作。

for i in `lsof |grep deleted |awk '{ print $2 }'` ; do kill -15 $i ;done

三、du和df的原理

du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数,因为是stat所以所有类型的 ”文件” 都可以统计的到;而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。

du命令是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。

你可能感兴趣的:(linux,文件大小总和)