这是一个不太可能的想法,但也许了解 Sysinternal 进程监视器内部工作原理的人可能会有一个想法。
最近我们在工作中遇到了一个非常棘手的问题。我们有一个软件(称为 SW1),它在特定端口上与另一个软件(称为 SW2)创建套接字连接,并从该软件接收一些数据。然后,它与属于它的另一个进程创建另一个套接字连接,并向其发送一些数据,之后循环重新启动并开始从 SW2 接收更多数据。
这是一个非常模糊的描述,我与这两个应用程序都没有任何关系,但是作为工作站的所有者,我一直积极参与支持。整个系统在一个特定的工作站上没有任何故障,但在其他四个相同的工作站上却无法工作。症状是 SW1 的两个进程之间发送数据包突然停止,随后 SW2 自然会超时。
现在,说说古怪的部分:经过数周与相关团队的调试和运行 Wireshark 之后,我决定运行 Process Monitor,也许会出现一些结果。奇怪的是,套接字连接仍然保持建立,整个过程都正常工作!我们认为这只是巧合,于是我们尝试在其他三个上运行 Process Monitor,它们都开始工作了。此外,看起来重新启动所有程序仍能使应用程序正常运行。
当然问题仍然存在:Process Monitor 可能对这些应用程序产生什么影响?由于解决方案的性质,我无法真正分析 procmon 捕获,因为它似乎正在解决问题......
谢谢!
答案1
听起来像竞争条件或者死锁。
即:SW1 和 SW2 必须具有包含请求和确认的通信协议。如果此协议设计不当,则可能出现竞争条件,数据包无法按正确顺序发送。SW1 处于等待 SW2 数据包的状态,但 SW2 过去已经发送过该数据包(SW1 错过了该数据包),SW2 不会再次发送该数据包,从而导致 SW1 处于锁定状态。
如果是这种情况,故障取决于 SW1 和 SW2 的执行速度,以及服务器的负载。假设两个进程执行速度都很慢,则 SW1 错过来自 SW2 的数据包(从而导致锁定状态)的可能性就更大。运行系统监视器会稍微减慢整个系统的速度,这可能足以使此操作成功。
至于不同的服务器,如果第一个服务器比其他服务器有更多的负载,那么它就可以正常工作。