我们的一位客户拥有一台 2008R2 Datacenter Edition SP1 文件服务器,并在多台访问这些文件的机器上运行我们的应用程序。有一种特殊情况,即存在一个文件(在文件服务器文件夹中),每 20 或 30 秒每台机器都会打开(进行读写),如果发现无法处理,则立即再次关闭。完全独立的联锁机制可防止多个节点同时尝试打开该文件。
当所有访问计算机都运行 Server 2008R2 时,这种方法效果很好,即使服务器打开文件列表显示文件永久打开。但是,当 Windows 2003 计算机启动并运行相同的应用程序和相同的联锁时,它总是无法打开具有共享冲突的文件,并且该计算机也无法删除该文件。关闭所有 2008R2 访问器会导致文件从文件服务器打开文件列表中消失,并允许 Windows 2003 计算机打开并删除该文件。但是,由于访问器已关闭,PROCMON 显示没有与该文件的联系。
就好像 2008R2 机器和服务器使用一个私有代码来保持文件处于伪打开状态,而 2003 不知道这个代码,所以它认为文件确实打开了。它实际上不可能永久打开,因为 2008 节点会定期打开它。如果我的理论是正确的,我们的客户该如何修复它?
答案1
我立即怀疑 SMB 和 SMB2 客户端访问同一文件的互操作性存在一些损失。您至少可以尝试通过在 Windows Server 2008 R2 客户端上禁用 SMB2 来将该行为隔离为 SMB/SMB2 互操作性问题。(从性能角度来看,这是一件坏事,但它可能会将问题隔离到足以确定删除 Windows Server 2003 客户端是“解决方案”。)
你能描述一下你的“联锁”协议是如何运作的吗?
答案2
Evan 的建议很中肯,所以我会首先采纳。如果您没有得到任何支持,那么您应该了解 Windows Server 2003 的一些信息:在文件共享上执行某些类型的活动时,rdbss.sys 中存在严重的竞争条件/锁定错误。
症状和情况可能有所不同,如果文件争用足够严重,甚至可能会锁定 Windows 2003 服务器。我不确定为什么它没有更频繁地出现,但我做类似的事情时肯定会遇到困难。还要注意,即使有独立的锁定机制,也可能有其他进程访问这些文件,例如防病毒软件。
以下是知识库文章。不要被那些不相关的标题分散注意力。
http://support.microsoft.com/kb/960092
http://support.microsoft.com/kb/983169
为了更好地了解实际发生的情况,您需要在发生这种情况时在 2003 服务器上执行网络数据包捕获。NetMon 的 SMB 解析器实际上相当不错,您通常可以发现锁争用问题。