(读)文件I/O抖动

bas*_*ijn 8 c# file-io

我有一个执行多个readfile操作的应用程序(C#.Net 3.5和.Net 2.0).但是,系统时不时会显示hickup(抖动).我已经附加了VTune分析器并执行了锁定和等待分析,请参见下面的第一张图片.

锁定和等待分析显示"同步对象:流文件路径"导致应用程序在所有线程上被锁定(等待).在此期间,CPU利用率降至0%.

接下来,我使用SysInternals Process Monitor来记录发生hickup时执行的操作.它显示了一个大约需要的文件读取操作.1秒,但只是偶尔(抖动).见第二张图片.

在此输入图像描述 单击大图像版本:这里

文件I/O抖动 单击图像的大版本:此处

我很困惑.什么可能导致文件I/O中的这种抖动?这是一个同步的阅读.我试图将读取缓冲区从32,768b减少到4096b,但这没有任何机会.也许需要注意的是,用于收集这些数字的机器有一个SSD.但是,我们在没有SSD的机器上看到类似的hickup.

任何在哪里看的线索都会受到欢迎.

bas*_*ijn 2

这个问题需要更新。我将以答案的形式发布此内容,因为我已经解决了问题,但不是以我可以肯定地说原始问题是什么的方式。

我尝试了很多方法来找出导致 IO 读取(文件)持续时间偶尔出现峰值的原因。首先,病毒扫描程序很重要,尤其是迈克菲造成了一些麻烦。关于这个问题的评论已经在这里暗示了,@remus rusanu 的使用 WPA/WPR 组合的提示也表明了这一点。WPA/WPR 组合让我惊喜不已,它是仅次于 VTune 和 ProcMon 的宝贵工具。第一张图片显示,在一些长时间刷新和读取开始(>1 秒)之前,McAfee 任务管理器出现峰值。第二个显示 WPA 中的所有信息在所有图表上都很好地链接在一起。如果大海捞针的话,这是一个很好且强大的工具。

在此输入图像描述 快速链接大版本:这里

在此输入图像描述 快速放大版本:这里

然而,当我卸载病毒扫描软件时,峰值仍然出现。频率较低,持续时间较短,但在应用程序中仍然可见。我尝试了很多方法来找出它是什么。使用 VMWare 设置,这样我就可以完全剥离系统并查看其他进程是否可能是问题所在。最后我放弃了。我实现了一个系统来解决这个问题,目前这已经足够了。了解我采取的所有行动后,我会说还有另一个相互冲突的过程。另一种选择是链接的非托管程序,它使用互斥体,可能会做一些有问题的事情。我将互斥锁更改为 CriticalSections,但没有直接可见的结果,因此我放弃了这条路线。

最后,不幸的是我没有直接的答案。由于时间限制,我被迫解决这个问题,并且可能永远不会知道问题的根本原因是什么。我想这也是现实生活吧。。

感谢所有的提示,我学到了一些我将来肯定会用到的东西。