AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 129953
Accepted
knorv
knorv
Asked: 2010-04-06 08:12:40 +0800 CST2010-04-06 08:12:40 +0800 CST 2010-04-06 08:12:40 +0800 CST

一个 ext3 目录中的最大文件数,同时仍然获得可接受的性能?

  • 772

我有一个应用程序写入 ext3 目录,随着时间的推移,该目录已增长到大约 300 万个文件。不用说,读取这个目录的文件列表是非常慢的。

我不怪 ext3。正确的解决方案是让应用程序代码写入子目录,./a/b/c/abc.ext而不是仅使用./abc.ext.

我正在更改为这样的子目录结构,我的问题很简单:我应该在一个 ext3 目录中存储大约多少个文件,同时仍然可以获得可接受的性能?你有什么经验?

或者换句话说;假设我需要在结构中存储 300 万个文件,那么结构应该有多深./a/b/c/abc.ext?

显然这是一个无法准确回答的问题,但我正在寻找一个球场估计。

linux filesystems ext3 capacity-planning linux-kernel
  • 9 9 个回答
  • 22977 Views

9 个回答

  • Voted
  1. Best Answer
    Ignacio Vazquez-Abrams
    2010-04-06T08:29:35+08:002010-04-06T08:29:35+08:00

    如果您有一个支持该dir_index功能的发行版,那么您可以轻松地在一个目录中拥有 200,000 个文件。不过,为了安全起见,我会将其保持在 25,000 左右。如果没有dir_index,请尝试将其保持在 5,000。

    • 12
  2. Sean Reifschneider
    2011-09-23T21:09:01+08:002011-09-23T21:09:01+08:00

    非常小心如何选择目录拆分。“a/b/c”对我来说听起来像是灾难的秘诀……

    不要盲目地做几个目录深度结构,比如第一级有 100 个条目,第二级有 100 个条目,第三级有 100 个条目。我去过那里,做到了,得到了夹克,当性能因数百万个文件而陷入困境时,我不得不对其进行重组。:-)

    我们有一个客户端进行“多个目录”布局,最终每个目录只放置一到五个文件,这正在杀死它们。在这个目录结构中做一个“du”需要 3 到 6 个小时。这里的救星是 SSD,他们不愿意重写这部分应用程序,而 SSD 将这个 du 时间从几小时缩短到几分钟。

    问题是目录查找的每一级都需要查找,而且查找非常昂贵。目录的大小也是一个因素,所以让它更小而不是更大是一个很大的胜利。

    要回答您关于每个目录有多少文件的问题,我听说 1,000 被称为“最佳”,但 10,000 的性能似乎还不错。

    所以,我推荐的是一级目录,每一级是一个 2 个字符长的目录,由大小写字母和数字组成,顶层大约有 3800 个目录。然后,您可以使用包含 3800 个文件的子目录保存 14M 文件,或者对于 3M 文件,每个子目录大约 1,000 个文件。

    我为另一个客户做了这样的改变,它产生了巨大的变化。

    • 10
  3. David Gelhar
    2010-04-06T08:29:05+08:002010-04-06T08:29:05+08:00

    我建议您尝试使用诸如postmark之类的基准测试工具测试各种目录大小,因为有很多变量,例如缓存大小(在操作系统和磁盘子系统中)取决于您的特定环境。

    我个人的经验法则是将目录大小设为 <= 20k 个文件,尽管我已经看到最多 100k 个文件/目录的性能相对不错。

    • 6
  4. Amy B
    2010-04-06T08:31:44+08:002010-04-06T08:31:44+08:00

    我将所有文件都放在以下文件夹中:

    上传/[日期]/[小时]/yo.png

    并且没有任何性能问题。

    • 3
  5. bradlis7
    2010-04-06T08:25:38+08:002010-04-06T08:25:38+08:00

    http://en.wikipedia.org/wiki/Ext3#Functionality - 这提到一个目录只能有大约 32000 个子目录,但没有提到文件。

    http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/

    另外,我讨厌专家交流,但我读到了关于这个问题的评论,每个目录最好少于 10-15,000 个。

    • 2
  6. jriskin
    2012-10-17T15:07:03+08:002012-10-17T15:07:03+08:00

    我可以在一个相当强大的服务器上确认,在相当大的负载下有足够的内存,70,000 个文件可能会造成各种破坏。我删除了一个包含 70k 文件的缓存文件夹,它导致 apache 开始生成新实例,直到它达到 255 个最大值并且系统使用了所有可用内存(16gb,尽管虚拟实例可能更低)。无论哪种方式,将其保持在 25,000 以下可能是一个非常谨慎的举措

    • 2
  7. Sam Rodgers
    2010-04-06T09:36:32+08:002010-04-06T09:36:32+08:00

    根据我的经验,最好的方法是不要提前过度设计文件结构。正如至少在另一个答案中提到的那样,有一些文件系统扩展可以处理性能问题。

    我经常遇到的问题是管理端的可用性。您可以做的最少的工作来减少目录中的文件数量可能是您现在需要的方法。

    sqrt(3_000_000) == 1732

    一个目录中的几千个文件对我来说听起来很合理。做你自己的判断你自己的情况。为此,请尝试将文件拆分为单级哈希目录,以便每个目录的平均文件数与目录数大致相同。

    鉴于您的示例,这将是./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ... 。

    文件的传播很大程度上取决于实际的文件名。想象一下,将这种技术应用于包含一百万个文件的目录,每个文件名为foobar???.txt. 有一些方法可以实现更均匀的传播,例如基于每个文件名的 MD5 总和中特定位数的值的散列,但我敢猜测这对于你想要完成的事情来说太过分了。

    • 1
  8. quickshiftin
    2011-09-23T20:40:38+08:002011-09-23T20:40:38+08:00

    嗯,最近看了这篇文章。本质上,您利用了您最喜欢的散列算法的分布。我开始玩这些数字,MySQL 签名的 INT 的最大值为 2147483647。您还可以改变每个目录所需的文件数和子目录数来确定最终的子目录/文件数-给定数据集的每个目录拆分,但很难找到关于最佳目录/文件组织的经验证据。 本文确实对跨文件系统的性能差异(一些有趣的指标)提供了一些见解,但没有关于最佳组织的内容。

    • 1
  9. Eric Seppanen
    2010-04-06T09:37:34+08:002010-04-06T09:37:34+08:00

    我觉得你在这方面考虑太多了。如果您甚至选择了一个附加级别的目录并且能够平衡平衡,那么您将拥有 1732* 个目录和每个目录 1732 个文件。

    除非您计划需要数百亿个文件,否则您几乎可以在 1000 到 100,000 之间选择一个数字并获得良好的结果。

    * 300 万的平方根。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve