linux下硬盘占用显示不一致的问题

参考链接

文件被打开之后如果进程一直在,即便是删掉文件也不会释放空间反而会一直占用硬盘,使用du看到只占用了一点,而使用df则看到硬盘被占用了很多,原因是du是遍历文件,du是读取分区信息

起因

有同事在群里发了一张求助的图片,说是机器df看硬盘已经快满了,但是使用du看挂载盘下面的文件大小只有十几个G,现在硬盘一直在报警问怎么办,登陆机器执行du和df简单看了下,确实是这样,即硬盘容量莫名其妙占用的问题

过程

简单看了下系统进程发现是有例行任务的机器,顿时心里有数了,如果没有猜错的话应该是进程日志太大第一次报警之后同事就上来处理把日志文件删掉了,但是进程一直还在,写日志也没有rotate结果导致原来的日志虽然入口被rm抹掉了,但是由于进程并没有释放相应的文件描述符资源,并且一直在write导致硬盘满,找到了大致方向,剩下的就是确认和定位了,这次自习看了下进程,赫然发现有一个运行了4天之久的进程存在,不出意外就是他了,执行lsof | grep delete确实发现了一个巨大的本删除的日志文件,并且pid确实是运行了4填的进程,反馈给了同事让他看一下那个进程咋回事,答复说,日志被删了没法看了。。。

总结

  1. 在找到问题之前,别乱删东西啊。。。
  2. 硬盘存储这个东西其实还是挺复杂的,du、df他们的原理也不一样,du是遍历目录分别打开各个文件从文件信息中计算空间占用,而df则不同他是直接使用的系统调用获取了挂载区的block数,节点数等等信息,由于两者的方式不同最终导致的结果不同,知道了这些以后再出现这种问题就知道该怎么查了
  3. 除了以上这种情况,还有一种情况会导致类似情况,不同的是df查看分区可用比特别小,但是du查看到的结果是文件总量空间却很低,这种情况就很有可能是大量小文件存在导致inode耗尽引发的现象,这种情况需要使用df -i来查看。参考链接,有兴趣的可以仔细读一读鸟哥写的这个,简单来说就是正常在linux下面文件是inode 存储文件信息,例如文件名字,权限、block号,然后block区域存储文件的具体数据信息,正常情况下inod和block是一对多或者多对多的情况,但是,如果全都是小文件的话,那么结果就是一对一了,这样就导致了inode大量占用,但是block占用很低

转载请注明来源链接 http://just4fun.im/2017/10/06/linux下硬盘占用显示不一致的问题/ 尊重知识,谢谢:)