当 svchost 变得太大并阻塞我的系统时杀死它

Killing svchost when it becomes too big and clogs up my system

我有一个系统,可以一次 运行 进行数千次测试。随着时间的推移,这个系统会因为内存泄漏而崩溃。为了解决这个问题,我正在开发测试基础架构的更新版本。该版本将及时处理非托管资源。当前版本已有 10 年历史,一开始的编码并不是很好。

在我有时间实施我需要实施和测试的数百个更改之前,我找到了一个创可贴。随着系统 运行s,特定的 svchost 进程不断增长,直到系统发出 Out Of Memory 异常。我的解决方案已经连续工作了一个星期,一直是添加一些代码来终止任何增长过大的 svchost 进程。这具有释放非托管资源发出的所有 OS 句柄的效果,并且到目前为止还没有引起任何其他问题。

我的问题是 - 为什么这种解决方案不受欢迎?如果我已经让它连续一周进行了数千次测试,那么在我研究问题的真正解决方案时,它在短期内是否安全?我意识到这不是一个正确的解决方法,因为它治疗的是症状而不是疾病,所以我特别想问一下这种方法会出现什么问题以及为什么这种方法不受欢迎。

到目前为止,每当我杀死臃肿的 svchost 进程时,其他 svchost 进程就会填补空缺。在最大的 svchost 进程完全终止之前,任何 OS-特定的和需要的东西都会被重新生成或传递给其他 svchost 进程。唯一真正被永久杀死的是一个包,其中包含从我的测试基础设施程序中出现的句柄。

因此,经过数十万次迭代测试,我的解决方案几乎始终有效。我仍然需要解决一些边缘情况,但它有效。多个 svchost 进程可以在任何给定时间存在,并且它们都可以为不同的服务持有线程。杀死一个 svchost 进程是 "safe" 只要你现在就杀死它。

就我而言,随着时间的推移,特别是一个 svchost 进程会越来越大。一旦它达到一定大小,我就会杀死它,系统将继续 运行 正常运行。这是因为如果那个特定的 svchost 进程内部有任何关键或关键服务 运行,OS 知道如何在任何东西被杀死之前将它们移植到另一个 svchost 进程。最终结果是你只能强行杀死无论如何都需要去的东西。在 运行 不同的测试中,这对我来说在不同机器上的多次迭代中完美无缺。需要收集更多数据,但至少在短期内有效。我意识到正确的解决方案是遍历整个代码库并正确处理资源......但是当你是一名实习生时,当代码库足够大以至于以这种方式重构代码需要永远...... .并且当它是几个难以跟踪的 .NET 内存泄漏时......我觉得打破 "rules" 并实施这样的解决方案是可以的。它旨在使我们能够在我研究更好的解决方案时从多次执行迭代中获取数据。