如何在Linuxnetworking服务器上最有效地存储和服务1,000,000个以上的小型文件?

我有很大的静态内容,我必须通过基于Linux的networking服务器来提供。 它是一套超过一百万个小的gzip文件。 90%的文件小于1K,其余文件最多50K。 在将来,这可能会增长到超过1000万个gzip文件。

我应该把这个内容放在一个文件结构中,还是应该把所有这些内容放在一个数据库中? 如果是在文件结构中,我可以使用大型目录还是应该考虑使用较小的目录?

我被告知一个文件结构的交付速度会更快,但另一方面,我知道这些文件会占用大量的磁盘空间,因为文件块将超过1K。

交货业绩最好的策略是什么?

UPDATE

对于logging,我已经在Windows 7下执行了一个testing,有五十万个文件:

在这里输入图像描述

我猜测FS结构会更快,但是你需要一个好的目录结构来避免拥有大量文件的目录。

我不会太担心丢失的磁盘空间。 举个例子,在16K的块大小的情况下,在最坏的情况下,每个文件需要一个额外的块,你将会丢失15GB的空间。 使用今天的磁盘大小,这是没有什么,你可以适应你的文件系统的参数为您的具体需要。

如果select文件结构选项,至less在某种程度上可以改善磁盘I / O性能的一件事是使用noatime + nodiratime挂载分区,除非必须拥有它们。 他们并不重要,所以我build议你这样做。 也许你也可以使用固态驱动器。

我认为这里的正确答案取决于如何将文件编入索引…什么决定何时给定的文件被选中交付。

如果你已经做了一个数据库查询来确定你的文件名,那么你可能会发现你最好把数据保存在数据库logging中,你可以通过调整数据库中的一些分页设置来find最好的结果。select,然后将文件存储在数据库中(例如:较大的页面来说明所有bloblogging),或者您可能会发现使用文件系统仍然更好。

数据库选项有一个更好的机会,因为有一百万条logging,很可能每个文件都不太可能被查询。 如果您处于一个文件可能连续或几乎连续查询数次的情况,那么数据库可以充当最近检索到的文件的事实caching,在这种情况下,您经常会得到文件结果已经加载到内存。 您可能需要仔细调整数据库引擎的内部以获得所需的行为。

但是,从我的答案中,主要的一点是, 除非您用一些具有代表性的testing数据进行testing并测量结果否则您不会真正了解哪种方法最好。

现代文件系统不应该是一个问题。 我已经testing了10亿个文件在同一个目录中的XFS,并且我非常确定ext4也可以做得很好(只要文件系统本身不是太大)。 有足够的内存来caching目录条目; 更大的处理器caching也将有很大帮助。