我们有一个应用程序,使用ReadDirectoryChangesW()来监视远程目录的更改通知。 根据Microsoft文档,每个未完成的更改通知请求都会消耗服务器上的“工作项目”资源。 我有一个testing,在Windows Server 2003(32位)机器上监视数百个目录。 当目录数量超过某个值(大约120)时,它会一直失败,此时在服务器上logging一个事件,如下所示:
服务器在最近60秒内无法分配工作项目2次。
当发生这种情况时,连接被中断,perfmon显示“Work Item Shortage”已经发生。
这里和那里的文章指出,可以通过设置MaxWorkItemsregistry项来增加工作项的数量。 然而,我不清楚这是否适用于Windows Server 2003.我试着把这个键(和MaxMpxCt一起 )设置为更高的数值,大约几千,然后重新启动服务器服务(也重新启动)。 然而,perfmon总是显示“可用的工作项目”在120-160附近的某处。 当我运行我的testing程序时,这个数字下降,可以预见,直到它达到零,短缺logging,并连接到我的客户端被丢弃。
我的问题是:我可以影响我的设置中可用工作项目的数量,如果是这样,怎么办? 我也可以为我们可能使用的其他版本的Windows(即Server 2008等)做到这一点?
为了logging,我也尝试玩MinFreeWorkItems , InitWorkItems , MaxRawWorkItems和MaxCmds ,都没有用。
参考文献:
是的,它确实。 MSbuild议8000的限制,但这些是工作项目队列。 过去我们把这个增加到16000,但是我们很快就用完了非页面缓冲池内存,因为32bit有256mb的硬性限制。 我们有MS,他们说,虽然你可以增加工作项目64000技术上,这不是一个好主意,他们强烈build议我们限制回到8000。
这造成的另一个问题是排队的东西,依靠处理它们失败的项目。 文件删除,ms群集心跳等事情。 我们有文件的实例被删除,但重新出现作为工作项目没有处理。