在使用FILE_FLAG_WRITE_THROUGH打开的HANDLE上调用WriteFile时应该何时阻塞?

时间:2016-06-11 17:23:55

标签: windows winapi ntfs windows-nt sata

在工作中,我们在Jenkins的帮助下定期在几台构建机器上运行我们的单元测试。其中一个单元测试打开一个FILE_FLAG_WRITE_THROUGH的文件,并在此文件上进行数万次WriteFile次调用。为什么这样做与这个问题无关。在其中一台构建机器上,此测试不断超时。经过一番调查后发现,其根本原因是每次调用WriteFile都被阻塞(线程被切换,并在之后切换),使测试运行速度明显变慢。奇怪的是,当在这台机器上手动启动测试时,WriteFile没有阻塞,因此测试没有超时。

经过数小时的反复试验,如果Jenkins启动了任务计划程序,WriteFile被阻止,手动启动或放置了一个,我在受影响的计算机上找到了一个"解决方法": BAT文件在Startup文件夹中,它没有。我认为我需要进一步调查,所以我创建了一个最小的repro,一个用FILE_FLAG_WRITE_THROUGH打开文件的小程序,并用随机数据10000次调用WriteFile。使用这个最小的repro,WriteFile会不断阻塞,无论我如何启动它。我真的很困惑,所以我在这里要求对这种行为做出任何解释。我执行测试的所有机器都有SATA驱动器,默认设置(写入缓存和Windows写入缓存刷新已启用)。

首先,对我来说,它甚至不能100%清楚FILE_FLAG_WRITE_THROUGH应该做什么。互联网上的信息表明特殊标志传递给设备,要求它在写入后刷新其缓存。根据{{​​3}}(和其他一些人)的说法,现在这几乎无关紧要,因为大多数SATA驱动器由于性能原因而默默地忽略了这个标志。在"应该或不应该阻止"方Raymond Chen明确指出,FILE_FLAG_WRITE_THROUGH WriteFile 阻止:

  

在将数据写入文件之前,写入调用不会返回。

你有什么想法我为什么会看到这种奇怪的行为(不一致)?我该如何进一步调查?

0 个答案:

没有答案