df与du已使用空间不一致的原因及排查

问题发现:

linux df -h 显示使用空间已满,用 du -sh 查看哪个文件夹占用空间比较大时显示只使用了26G 差距很大,例如:

[root@ls-dj-test-4 /]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda1 308G 308G 20K 100% /data

[root@ls-dj-test-4 /]# du -sh /data/

26G /data

从这里面可以看出通过du看到使用了26G,但是通过df 看,/data目录已使用308G

原因:

显示大小不一样,一般而言,df显示的使用空间要大于du,这是因为: 当一个文件被删除的时候,在文件系统的目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

办法:

  • 1、lsof |grep deleted > deleted_file查看有哪些未被释放的文件
  • 2、排序看最大的未被释放的文件大小,命令:sort -nr -k 7 deleted_file > sort_deleted_file
  • 3、cat sort_deleted_file 查看前面那些文件,将占用空间大的程序kill掉 kill [pid]