我们有一个在 5 个(服务器)节点(16 个核心,每个 128 GB 内存)上运行的应用程序,在每台计算机上加载近 70 GB 的数据。该应用程序是分布式的并为并发客户端提供服务,因此,有大量的套接字使用。类似地,对于多个线程之间的同步,有一些同步技术正在使用,大多数使用System.Threading.Monitor
.
现在的问题是,当应用程序运行并且数据在这些服务器节点之间以及客户端和服务器之间传输时,一台或两台服务器计算机开始接收OutOfMemoryException
即使还有 40+% 的内存仍然可用。我们感觉这个异常来自非托管代码。虽然我们没有直接进行任何非托管调用,但我们已经看到 OOM 异常堆栈跟踪中的最后一个调用始终是内部调用非托管代码的框架调用。
以下是几个例子。
Exception of type 'System.OutOfMemoryException' was thrown.
at System.Threading.Monitor.ObjPulseAll(Object obj)
....
Exception of type 'System.OutOfMemoryException' was thrown.
at System.Threading.Monitor.ObjWait(Boolean exitContext, Int32 millisecondsTimeout, Object obj)
at System.Threading.Monitor.Wait(Object obj, TimeSpan timeout)
....
我们对导致此问题的原因一无所知。我们已在这些机器上多次引发 GC,但这似乎也没有帮助。
任何帮助,将不胜感激..
EDIT:
以下是更多详细信息;
- 应用程序正在 x64 进程中运行。
- Windows Server 2012 R2
- .NET框架4.5
- 启用服务器GC
-
AllowLargeObject
标志已设置。
EDIT2:请注意,这不是内存泄漏。此处 70 GB 进程大小有效。
其他用户建议的一些初步问题很酷,但是您是否考虑过偷懒并分析您的应用程序?
我可以想到 Redgate 的 Ants profiler 或 JetBrains 的 dotmemory,链接如下。
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/ http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/
https://www.jetbrains.com/dotmemory/ https://www.jetbrains.com/dotmemory/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)