Windows-服务不定期冻结

Windows-Services freeze irregularly

因为我运行无法与我们的管理员讨论争论,希望您能帮助我解决以下问题。

我们有一个奇怪的行为对应于我们自行实现的 windows-服务。他们随机冻结。有时他们会连续工作数周,有时他们会在一周内冻结多次。我很确定,错误代码或未处理的异常没有问题。在我看来,这是某种 windows admin/rights 管理问题以及时间上的巧合。

但是让我们先从一些信息开始:​​

因为我看不到任何记录的错误,所以我在相应的服务器上安装了 DebugDiag,为提到的服务添加了崩溃规则,也许发现了一些有趣的东西。 这是 DebugDiag 日志的摘录:

[12.06.2017 01:04:05]
  Thread created. New thread - System ID: 17372
[12.06.2017 01:04:29]
  Thread exited. Exiting thread - System ID: 7152. Exit code - 0x00000000
[12.06.2017 06:55:25]
  Thread created. New thread - System ID: 13252
  Thread exited. Exiting thread - System ID: 31012. Exit code - 0x00000000
  C:\Windows\System32\wship6.dll Unloaded from 0xfcee0000
  C:\Windows\System32\wshtcpip.dll Unloaded from 0xfc650000
  C:\Windows\System32\fwpuclnt.dll Unloaded from 0xfb1c0000
  C:\Windows\system32\security.dll Unloaded from 0x6f9e0000
  Thread exited. Exiting thread - System ID: 25912. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 17372. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 27412. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 13252. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 31768. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 27540. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 12252. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 29336. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 5620. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 8248. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 4340. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 18056. Exit code - 0x00000000
  Thread exited. Exiting thread - System ID: 34164. Exit code - 0x00000000
  Process exited. Exit code - 0x00000000

此时再次冻结的服务(假设它是服务 A 变体 2)的最后生命迹象是在 01:04:29,其中一个线程已退出。在 06:55:25,我们的一位管理员重新启动了该服务,因为他看到该服务似乎被冻结了。 DebugDiag 没有编写转储,所以我再次假设该服务没有崩溃。

对我来说很奇怪,wship6.dll、wshtcpip.dll、fwpuclnt.dll 和 security.dll 在重新启动服务时被卸载了,因为我还没有看到这个。我多次尝试重新启动服务 A 的另一个变体,但没有被冻结。我看到了相同的条目,但它们是在第一次重启后才写入的。即使在停止并再次启动该服务后,我也看不到库已卸载。

于是查了很多资料:

编辑 16.06.2017: 昨晚是另一个 windows 服务停止了相同的行为。 windows 服务的一些变体已被冻结,一些仍在工作。但是这次你看不到在重新启动服务时提到的 DLL 被卸载了。也许对卸载的 DLL 的最初怀疑无助于进一步诊断。一个有趣的事实:此服务与第一个服务同时停止工作。也许 VM 备份或类似问题有问题?我想有一个常规任务导致了这个问题。你有什么提示吗?

编辑 2017 年 6 月 19 日: 我想我们发现了一些有趣的东西。冻结服务都有一个共同的 .Net 组件:一个 filesystemwatcher。这在过去从来都不是问题,因为我们使用自重新连接功能扩展了 .Net-filesystemwatcher。包含与我们的 filesystemwatcher 相关的路径的文件服务器每晚都会备份。如果此网络路径不可用,我们的 filesystemwatcher 重新连接功能会每秒检查一次。如果是这样,则在路径再次可用后重新连接 filesystemwatcher。管理我们所有虚拟服务器的托管服务器已于几天前升级。所以我们有以下怀疑: 假设我们的 windows 服务在时间 t_1000 和 t_2000 检查网络路径。虚拟服务器备份在时间 t_1200 断开虚拟文件服务器,其中包含由 filesystemwatcher 监视的网络路径,并在 t_1500 重新连接路径。在这种情况下,我们的重新连接功能无法正常工作,因为在 t_1000 和 t_2000 网络路径可用。尽管如此,filesystemwatcher 失去了他的连接并且不会对提到的网络路径中的传入文件做出反应。这以前不是问题,因为由于此服务器中使用的硬件速度较慢,我们的备份软件触发的重新连接花费了一些毫秒的时间。所以我们的重新连接功能运行良好。

那我们能做什么呢?

非常感谢。

这是我们为感兴趣的每个人提供的解决方案:

备份软件的供应商知道这个问题,但不愿意修复它。所以我们决定创建一个新的虚拟机,用作我们需要的文件服务器。这个新的文件服务器将不会通过快照备份。

我没有找到进一步改进我们的 filesystemwatcher 的方法,所以我想这是我们解决问题的唯一机会。