有很多小文件的系统,EXT4的性能变得非常糟糕

我有一个只有128MB内存的小型embedded式设备

连接到这个设备是一个2TB的USB2硬盘

我一直对设备的性能感到非常高兴,直到最近当文件数量已经超过了磁盘容量的阈值已经跨越了一个门槛(我不知道是哪个)

在磁盘上有很多小文件,由于编写应用程序文件的性质以非常均衡的方式组织 – 没有叶节点目录有超过200个文件,并且只有超过800,000个文件。

我希望能find一些可以调查的东西。 磁盘性能大幅下降,该设备相当不错,然后突然性能下降像一块石头。

我的假设是,我为磁盘文件select的组织结构已经损害了索引节点caching的能力。

作为一个实验,我卸下了磁盘(冲洗caching,免费validation)。 然后从命令提示符我深入到目录结构。 所有告诉这个目录(和它的孩子)只有大约3200个文件包含在它下面,在这一点上'免费'显示大于117MB的可用内存

在这一点上,我input命令“查找”,然后“免费”

“查找”显示约3000个文件,但内存使用从大约117MB到大约2MB

我了解caching与可用内存的平衡,以及内核如何将空白页面视为不良页面 – 然而,从3000个文件目录中caching的115MB内容指向了我认识的严重缺口。 我希望有人能帮助我理解发生了什么

我可以假设一个平衡的树是有很多文件去的方式吗?

非常好的问题描述。

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

如果你戳到meminfo和slabinfo,你会得到你正在寻找的细节。 如果你想让我看,pastebin它;)