文件系统监视器内部缓冲区溢出

4

当我尝试监视网络路径(分布式文件系统DFS)上的文件夹时,出现了System.IO.Internal.BufferOverflowException异常:变化太多。当FileSystemWatcher监视不使用此文件系统的本地/网络路径时,它正常工作。

我可以从1000多个本地路径的文件中获得事件,并且我没有出现BufferOverflow异常,然而当我将文件复制到位于DFS上的文件夹中时,我甚至无法从一个文件中获得事件。(为了澄清这一点,我获取到了一个错误事件...)

我已经尝试设置:

fileSystemWatcher.InternalBufferSize = 65536;

我不确定这是否有帮助,但路径看起来像这样:

\\corpnet\cloud\\Network\testFolder\myFolderToMonitor

编辑:1 我不确定路径中为什么有两个双斜杠。我可以在没有问题的情况下监视到\corpnet\cloud路径的文件夹。但一旦我尝试监视任何以

</strong>开头的文件夹,就会出现错误。

...\\Network\...

非常感谢您提供的任何建议。

谢谢!

2个回答

9
当出现太多变化的时候,这是一个“喷火龙”问题。您已经将缓冲区大小增加到允许的最大值,Windows 不允许更大。它分配在“宝贵”的内存中,也就是核心内存池。
这可能是一个高度活跃的文件服务器,但更常见的是代码问题导致的。您没有足够快地从“喷火龙”中获取数据。事件处理程序必须尽可能快地返回,以便缓冲区可以及时清空并跟上文件服务器变化的速度。
通常会出现错误,典型的实现方式不明智,例如复制文件、读取文件、循环等待直到文件可以打开。这些都是昂贵的操作,循环错误是非常常见的错误,因为当事件触发时,文件很少能用,因为任何更改文件的应用程序仍然在使用它。而且锁定文件的时间没有上限。显然,这总是会导致缓冲区溢出。
因此,正确实现 FileSystemWatcher 事件处理程序只需迅速将传递的文件路径放入线程安全队列中,什么都不做,这不应该超过一微秒。同时,使用另一个线程尝试再次清空该队列,处理文件可能还不能打开的情况。

1
谢谢Hans的回答。我非常感激你为帮助我所付出的努力。这很可能是一个高度活跃的文件服务器,因为它是一个数据中心。关于我的代码问题,我不确定这是否是一个问题,因为我甚至没有到达那个循环/复制文件的部分。一旦文件被复制到目录中,我就会收到一个错误事件。我的文件创建事件是空的,仅用于测试目的,因此在我看来并不昂贵。我仍然认为这必须是与网络路径/文件系统/DFS或类似的东西有关。 - wariacik
还有一件事,你觉得这可能与我们网络中监控的共享文件夹的数据中心访问时延超过500ms-1000ms+有关吗? - wariacik

0

我遇到了同样的问题。在本地文件夹中观看并添加5个新文件没有问题。但是当我观看网络文件夹时,出现错误“目录中有太多更改”。只有5个文件。

你已经找到解决方法了吗?

我不能真正调整代码,所以我的临时解决方案是将文件放入临时文件夹并轮询该文件夹。当有新文件时,我会延迟500毫秒后单独移动它们。


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