631 字
3 分钟
文件系统目录性能
“100 万个文件,分别放在100个 / 10个文件夹,哪个读写性能更好?“
ext4 的目录性能瓶颈
现代的 ext4 文件系统使用了称为 dir_index
的功能,它通过B树结构来索引目录内容。
- 1万文件:对于现代的 ext4 系统,这个数量通常不会造成明显问题,但有些用户已经报告了性能下降。
- 10万文件:某些操作开始变慢,特别是
ls -l
这类需要读取所有文件属性的命令。 - 100万文件:大多数情况下会出现明显的性能问题,目录操作变得缓慢。
- 1000万文件:接近 ext4 的默认限制,会有严重的性能下降,系统可能显示警告信息。
在目录中有 10,000 个文件的情况下,如果该目录已从 inode 缓存中移除,ls -l
命令可能需要一分钟。 即使在缓存的情况下,也需要超过一秒钟。
为什么
ext4 的目录性能下降主要有几个原因:
- 索引结构限制:当文件数量达到一定程度时,B树索引结构的深度会增加,查找时间随之增长。
- inode缓存效率:大目录会占用更多的 inode 缓存空间,导致缓存效率降低。
- 目录索引容量上限:ext4 约允许”单个目录中有1000万个条目”,超过这个限制需要启用
large_dir
功能,但这也会带来其他问题。 - 文件系统警告:当目录中有大量文件时,ext4 可能会显示警告:“Directory index full, reach max htree level”,这表明目录索引已达到其最大哈希树级别。
建议
- 使用多级目录结构:比如可以根据文件哈希值的前几位字符创建子目录,将文件分散存储。
- 监控目录大小:当单个目录接近 10 万文件时,考虑重组目录结构。
- 考虑其他文件系统:如果你真的需要在单个目录中存储数百万文件,可以考虑XFS文件系统,它在处理大量文件方面表现更好。
- 使用数据库或键值存储:对于真正大量的小文件,考虑使用数据库或专门的键值存储系统,而不是直接依赖文件系统。
如果你必须使用文件系统存储大量文件,一个常见的做法是使用两级或三级目录结构。例如:
/data/a/b/abcdef1234.file