磁盘充足却提示空间不足?

背景介绍

公司有一个业务机器,是ubuntu系统的,主要是负责各种Android包的出包的任务。因为业务的增长最近出现了一个怪事,在执行出包任务时总是报一个错误“磁盘空间不足”,导致无法出包了。

"磁盘空间不足"是很常见的错误,但奇怪的是,通过命令`df -hl`查看机器的硬盘,显示对应分区的使用率只用了80%。这就难以解释了。抱着试试看看的心态我去修改一个文件,在里面增加一些数据,数据是可以正常写入。这就更加奇怪了。

Google了一下,有说是因为内存问题导致的,但检查了一下都是正常的,无奈都没有解决方案。因为当时影响了客户端同学的正常发布,所以紧急方案是迁移了一些不使用的文件到别的分区。然后Android的出包任务就恢复正常了。

业务恢复后,回想了一下具体的细节。在使用紧急方案迁移了部分文件后,磁盘的使用率从85%下降到了60%,然后出包就正常了。当时还做过一些尝试,去touch一个新的文件,也没有成功。因为实在没有头绪,所以只能天真地怀疑是硬盘出了一些玄学故障。所以临时方案是让运维的同学帮忙调整了磁盘使用率报警,改为80%,草草的结束了。

最终,一个偶然的机会,看到了以下的这个用法,才找到了问题的解决方案。因为在截图中我看到了一个新的命令 "df -i"。

具体原理解释

事实上`df -hl`的命令只是用来查询磁盘容量的使用情况,而限制磁盘的使用除了容量还有文件个数的限制,也就是常说的innode表。文件系统磁盘空间中大约百分之一空间分配给了 inode 表,所以也就有了文件个数最大限制的问题。

通常情况下与一个文件系统相关联的 inode 的数目足够多,我们不用担心这个问题。所以innode这个概念大部分同学都学不知道。事实上这也和这次的业务特殊性有关,因为这台机器是专门负责所有Android的资源包的出包。这些包的特点就是文件个数超级多,但每个文件大小都特别的小。所以才会出现了这样奇怪的问题。当然解决方案也很简单,后续新加磁盘的时候需要额外针对这个业务多分配一些innode表的空间,这样才可以充分利用到磁盘。

总结

其实本质上这是一个很简单的问题,仅仅是磁盘的文件个数达到了上限。但是因为以往一次次的成功经验都是使用的"df -hl",导致了极强的思维定式。误以为磁盘只有这个容量这个限制了,忽略了这么明显的问题。当然了思维定式其实是个很好的东西,能够帮助你快速反应。最重要的应该是在思维定式失效的时候去想想本质是什么,而不是用玄学来解释~

参考资料:

发布于 2019-05-20 08:40