写入大文件时的性能问题?

16

我最近参与了处理服务器控制台日志的工作,因好奇心起,想知道将日志写入大文件是否会有性能问题,与写入小文件相比。

例如,保持日志文件大小较小而不是让它们变得臃肿,这样做是否明智,但是我无法为任何一种方法提出充分的论据。

可能会在读取或搜索文件时遇到问题,但现在我更想知道写入是否会受到影响。寻求专家意见。

编辑: 我的想法是操作系统只需打开一个文件句柄并将数据推送到文件系统中。与文件大小几乎没有关联,因为您必须继续将数据附加到文件的末尾,并且每当数据块已满时,操作系统将向文件分配另一个块。如我之前所述,由于文件块的碎片化,可能会在阅读和搜索方面出现问题,但我在写入时没有发现太大差异。


2
如果您正在使用ext或其他现代Unix/Linux文件系统,那么填充磁盘(追加)日志文件是唯一会导致文件系统碎片化的用例(如果您在Microsoft的Windows上,则忽略此问题,几乎每个具有并发性或删除的用例都会导致文件系统碎片化)。为了缓解这种碎片化,应该轮换和压缩日志文件(使用日志轮换工具)。压缩不仅可以减小文件大小,还可以去除碎片。 - ctrl-alt-delor
可能还有一个更重要的问题:可管理性。虽然写入日志文件很重要,但如何处理存储管理(日志轮换、导出等)基本上将成为您架构中最显著的部分。大多数应用程序在某个大小或时间范围(天/周等)内限制其日志文件。这会产生许多较小的文件,您可以比单个文件更优雅地管理它们。 - MJZ
2个回答

15
作为一般规则,将一个块附加到小文件(或写入第一个附加到零长度文件的块)和将其附加到大文件之间应该没有实际差异。
有一些特殊情况(比如试图故障转移三重间接块或初始打开需要读取所有映射信息),这可能会增加额外的I/O操作。但稳态应该是相同的。
我更担心处理巨大文件的可管理性:备份慢、复制慢、查看慢等等。

2

我不是专家,但我会尽力回答。

更大的文件在磁盘上写入可能需要更长时间,实际上这不是一个编程问题,而是一个文件系统问题。也许有一些文件系统没有这样的问题,但在Windows上,大文件无法一次性写入,因此对它们进行分段需要时间(因为磁头必须移动到其他柱面)。假设我们正在谈论“经典”的硬盘驱动器...

如果你想要建议,我会选择写入较小的文件,并在每天或达到一定大小时轮换它们(或两者都进行)。这是我在企业级产品中看到的常见方法。


我认为的方式是,操作系统只需打开文件句柄并将数据推送到文件系统即可。与文件大小几乎没有关联,因为您必须继续将数据附加到文件末尾,每当数据块满时,操作系统就会为文件分配另一个块。 - Ashish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接