针对打开约 100 万个文件且存在 ulimit 问题的应用程序的最佳文件夹配置

针对打开约 100 万个文件且存在 ulimit 问题的应用程序的最佳文件夹配置

我有一个应用程序可以创建 16^5 个文件 (1048576)。我可以将其配置为在同一文件夹中创建所有文件,或者以我想要的任何方式将它们分开(每个文件夹有 1、2、3 或 4 个子文件夹)。示例:

/*

或者

/a/*
.
.
.
/f/*

或者

/a/a/*
/a/b/*
.
.
.
/f/f/*

或者

/a/a/a/*
.
.
.
/f/f/f/*

或者

/a/a/a/a/*
/a/a/a/b/*
.
.
.
/f/f/f/f/*

所有文件都小于 4KB。我使用 Ubuntu 12.10 64 位和 ext4 分区来存储这些文件。哪种文件夹结构最适合这种情况?也许其他文件系统最适合这种情况,有什么想法吗?

无论如何,我正在尝试运行这个算法,我应该能够打开 9999999 个文件:

user@pc$ ulimit
unlimited

user@pc$ cat /proc/sys/fs/file-max
9999999

user@pc$ cat /etc/sysctl.conf
fs.file-max = 9999999

但是,当我运行它并将所有内容保存在一个文件夹中时,大约 999999 个文件的 fopen 调用失败:

user@pc$ ls database/ | wc -l
999958

奇怪的是,这个 999999 是我之前在系统文件中设置的 file-max 值。当然,我在更新值之前重启了机器,可能这个值太大了,然后它就保留了最后一个值。这到底是怎么回事?

答案1

如果你看看进程(5)/proc/sys/fs/file-max“定义了系统范围内所有进程打开文件数量的限制”。具体来说,它并没有规定单个进程可以打开那么多文件。

你可能想参考sysconf(3),其描述OPEN_MAX为“一个进程可以随时打开的最大文件数”。您可以通过运行来检索此值getconf OPEN_MAX

事实上,我并不清楚你能把它做多大OPEN_MAX,而且我现在也不想进一步调查,但请随意尝试并向我们报告。

顺便说一句,我还会运行ulimit -a以显示所有限制。ulimit单独运行bash意味着ulimit -f,它仅显示 shell 及其子级写入的文件的最大大小。

PS 如果您的应用程序需要同时打开一百万个文件,我强烈建议您重新评估您的设计。

相关内容