EXT4性能在包含大量小文件的系统上变得非常糟糕

Modified on: Thu, 07 Nov 2019 03:00:04 +0800

我有一个只有128MB RAM的小型嵌入式设备

连接到此设备是2TB USB2硬盘

直到最近,当文件数超过磁盘容量阈值时,我对设备的性能一直非常满意(我不知道哪个)

磁盘上的

是很多小文件,由于编写应用程序文件的性质是以非常平衡的方式组织 - 没有叶子节点目录有超过200个文件而且只有超过800,000个文件。

我希望能够对某些事情进行调查。磁盘性能大幅下降,设备拉得很好,然后突然性能下降就像一块石头。

我的假设是我在磁盘上为我的文件选择的组织结构在某种程度上损害了inode缓存保持zippy的能力。

作为实验,我卸下了磁盘(刷新缓存,免费验证)。然后从命令提示符我深入导航到目录结构。所有告诉这个目录(和它的孩子)下面只有大约3200个文件,此时'免费'显示> 117MB的可用内存

此时,我输入命令'find'后跟'free'

'find'显示了大约3000个文件,但内存使用量从~117MB变为~2MB

我理解缓存与可用内存的平衡,以及内核如何将空页视为坏页面 - 但是,来自3000个文件的目录中的115MB缓存内容指向了我理解中的严重差距。我希望有人能帮我理解发生的事情

我可以假设平衡树是获取大量文件的方法吗?

作者:stuck

最佳答案

非常好的问题描述。

根据你的说法,我认为你看到的是板坯用量很高。一个很好的实验是在深入fs层次结构并发现3000时,在3秒的延迟内运行cat /proc/meminfocat /proc/slabinfo文件。本质上发生的是内核将遍历fs结构并扫描单个文件及其inode,并且所有这些文件都存储在内存中。如果检查/proc/slabinfo,您将看到一个名为ext4_inode_cache的对象,它告诉您每个inode将占用多少内存。将其与no对象(obj_size * no_obj)相乘,即可得到对象使用的内存量。深入到fs层次结构中,在系统达到内存区域的高水位之前,将消耗更多的内存。此时,内核将开始回收。

如果您查看meminfo和slabinfo,您将获得所需的详细信息。如果你想让我看一下,就把它粘贴吧;)


相关问答

添加新评论