这个问题是在我之前发布的一个问题的跟进: Windows fsync(FlushFileBuffers)性能与大文件 。 我find了一个可能的解决scheme,但也提出了新的问
在对不同场景进行基准testing时,我发现了一些令人惊讶的结果。 我希望有人可以帮助解释或指向解释这些结果的信息的方向。
这个基准testing所做的是将随机块(页面大小为4096个字节)顺序地写入一个文件,每批8页(32 K),然后刷新写入。 它共写了200000页,共计800 MB和25000个冲刷。 在开始写入之前,文件的大小被设置为最后的长度。
它总共支持4个选项,其中所有组合都运行:
FlushFileBuffers
操作(FS)。 下面的表格总结了我在我的系统(64位Win 7笔记本电脑,主轴缓慢的笔记本电脑)上对这些选项的所有组合的发现。
我发现,“fsynced”缓冲写入的性能随着文件的大小以指数级降低到令人难以置信的低吞吐量,这使得与大文件结合使用这种方式不可行。 如果文件的最后一个字节被写入(选项LB),吞吐量甚至更低,所以我担心在随机而不是顺序写入的情况下,性能会更加剧烈。
然而令人惊讶的是,对于无缓冲/写入I / O,吞吐量保持不变,与文件大小无关。 最初(第一个100-200 MB),它的吞吐量比缓冲写入的吞吐量要低,但之后平均吞吐量迅速增加,并且完成了800 MB的写入。 更令人惊讶的是,如果文件的最后一个字节被写入,吞吐量将增加2倍。
通过内存映射文件写入文件时,也会看到相同的性能指数下降,即使用无缓冲/写入标志打开文件也是如此。 而且在这里,如果文件有一个字节写到最后的位置,性能会变差。
更新基于霍华德的解释在这里和这里 ,我重新开始testing之前没有创build一个新的文件(即打开现有的,完全写入的文件,并覆盖它)。 我已经更新了原始问题中的代码,以反映为此testing所做的更改。 结果部分符合他在Linux上的解释和发现。 但是有一些明显的例外。 下面的表格提供了结果,红色突出显着的变化,蓝色突出显示变化没有发生,这是令人惊讶的(即如果霍华德解释中提到的效果是唯一的效果,则不符合预期)。
对于使用“fsync”刷新的缓冲写入文件(即不通过memmap),现在的性能已经从指数衰减变成了一个不变的趋势。 但是,现在比以前的testing场景需要更长的时间。 吞吐量是一个恒定的1.5 MB / s,在那之前它开始在20 MB / s左右,以指数衰减到大约1.5 MB / s。 看起来可能的解释是,文件元数据也在每次刷新时被刷新,导致完整的磁盘旋转以查找元数据的位置。
对于“直接写入”文件场景,写出最后一个字节的结果现在是相同的,与霍华德的解释相符。
然而,写入内存映射有一个明显的例外,并没有真正改变,这是令人惊讶的。 它们在写入性能上仍然performance出相同的指数衰减(从20 MB / s开始衰减到1.8 MB / s)。 这将表明有不同的机制在起作用。 一个值得注意的例外是如果底层文件创build没有FILE_FLAG_WRITE_THROUGH和执行“fsync”刷新。 这种情况现在显示了一个恒定(差)的性能,吞吐量约为1.6 MB / s。 由于我有些怀疑,我多次重复这个场景,每次都给出相同的结果。
为了弄清楚一点,我还使用一个较小的文件(50000页,总计200 MB)重新进行这个testing,以确认fsync性能(对于缓冲I / O)实际上取决于文件大小。 结果如下所示,值得特别注意的是红色。
这些结果与较大文件的结果相关性很好。 值得注意的变化是对于那些被突出显示的,写入性能稍高一些的地方,它们似乎达到了约7 MB / s的极限。
基于对我系统的观察,总结为高度推测性的结论:
鉴于观察到的性能,至less在我的使用情况下,这两个I / O选项不会代表可行的解决scheme。
根据Greg的build议,我将重新运行Windows磁盘cachingclosures的testing,并且运行Howard提供的基准testing代码,以排除由于我自己的错误导致结果偏差的可能性。
更新2我已经完成了testing,目前正在编译结果。 为了不写“完整的历史”,我将用结果的总结,发现和一些结论来代替这个问题的当前内容。 霍华德在这个问题上的答案,以及在.NET代码旁边运行c基准代码的能力是非常有用的。 这些应用程序的结果相关性很好。 Rlb的回答帮助我更好地理解与磁盘有关的“合理数字”是什么。 谢谢。
问题的一部分仍然没有答案。 尤其涉及在写入存储器映射时观察到的降低(和文件大小相关)性能。 这可能与寻求/元数据冲刷有关,但是我还不清楚为什么/如何。
您看到同步运行速度呈指数级下降,因为您认为这些并不是纯粹的顺序工作负载。 由于每次都是从一个新文件开始,因此您的写入正在增加文件,并且元数据需要在文件系统中进行更新。 这需要多次寻找,随着文件的增长,从文件末尾到元数据的搜索花费的时间越来越长。 我也错误地发布了您的其他问题,请参阅完整答案: https : //stackoverflow.com/a/18429712/894520
尝试关闭磁盘缓存并重新发布?
否则,这些指标是无稽之谈(Fsync和写入实际上可能不实际打击磁盘)。 Windows默认启用磁盘缓存和控制器缓存。
格雷格