我们有一个应用程序,它使用 来监视远程目录中的更改通知ReadDirectoryChangesW()
。根据 Microsoft 文档,每个未完成的更改通知请求都会消耗服务器上的“工作项”资源。我在 Windows Server 2003(32 位)计算机上进行了一项监视数百个目录的测试。当目录数量超过某个值(大约 120)时,它会持续失败,此时服务器上会记录一个事件,内容如下:
在过去 60 秒内,服务器有 2 次无法分配工作项。
当发生这种情况时,连接就会断开,并且 perfmon 会显示发生了“工作项短缺”。
到处都有文章指出,可以通过设置最大工作项目数注册表项。但是,我不清楚这是否适用于 Windows Server 2003。我尝试设置此键(以及最大MpxCt) 设置为更高的值,大约几千个,然后重新启动服务器服务(并重新启动)。但是,perfmon 总是显示“可用工作项”在 120-160 左右。当我运行测试程序时,这个数字可预测地下降,直到达到零,记录短缺,并且与我的客户端的连接断开。
我的问题是:我可以影响设置中可用工作项的数量吗?如果可以,该如何操作?我是否也可以对我们可能正在使用的其他 Windows 版本(例如 Server 2008 等)执行此操作?
顺便说一下,我也尝试过最少空闲工作项数,初始化工作项,最大原始工作项数, 和最大命令数,但都无济于事。
参考:
答案1
是的。微软建议限制为 8000,但这些是针对工作项队列的。我们过去曾将其增加到 16000,但很快就用完了非分页池内存,因为 32 位对此的硬限制为 256mb。我们请微软帮忙,他们表示,虽然你可以将工作项增加到 64000,但从技术上讲这不是一个好主意,他们强烈建议我们将其限制回 8000。
这导致的另一个问题是,依赖于处理它们的排队事项失败。例如文件删除、MS 集群心跳。我们遇到过文件被删除但又重新出现的情况,因为工作项未得到处理。