c# - (读取)文件 I/O 抖动

标签 c# file-io

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

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

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

enter image description here 单击大图:here

File I/O jitter 单击大图:here

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

欢迎提供有关查找位置的任何线索。

最佳答案

这个问题需要更新。我将以答案的形式发布此问题,因为我已经解决了这个问题,但我无法确定原始问题是什么。

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

enter image description here 快速链接大版本:here .

enter image description here 快速放大版:here .

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

总而言之,遗憾的是我没有直接的答案。由于时间限制,我被迫解决它,并且可能永远不会知道问题的根本原因是什么。我想这也是现实生活..

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

关于c# - (读取)文件 I/O 抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904215/

相关文章:

c# - VS Code IntelliSense在C#9.0上失败

c# - "[]"是有效的 JSON 吗?

c# - 使用 Moq,我如何设置一个带有输入参数的方法调用作为具有预期属性值的对象?

C - fwrite - 无法打开文件,因为它包含无效字符

javascript - 如何检查文件夹中是否有重复文件,而不使用 glob/listdir/etc.. 比较文件名?

c# - File.OpenWrite 给出错误,而 FileStream(sFile, FileMode.Open, FileAccess.ReadWrite) 没有

c# - 从集合中通用创建逗号分隔的字符串列表

c# - 当结构没有身份时,这意味着什么?

c - 尝试将文件复制到目录。但该文件会自行清除。 (C)

java - 在 Java 的 try-catch 方法中实现 while 循环