使用dotMemory创建内存快照会暂停应用程序吗



我有一个内存泄漏,只在生产中发生(一个Web应用程序(Asp.Net MVC((。

我想用dotMemory(或类似的工具(拍一张内存快照,看看发生了什么。

然而,我不确定这是否会导致生产暂停并打乱当前的任何请求。

Fwiw我在机器上有32 gb的RAM

所以我的问题是:

我可以在不恶意阻止/影响请求的情况下获得内存快照吗

是的,dotMemory和任何其他通过Microsoft Profileing API工作的内存探查器将暂停应用程序一段时间,从毫秒到分钟不等,具体取决于内存中的数据量。

我建议进行标准的Windows内存转储,在正常情况下也需要一些时间,但有一种技术可以帮助避免这种情况。然后,您可以在dotMemory或任何其他支持Windows内存转储的工具中对其进行分析。

https://blogs.msdn.microsoft.com/granth/2012/07/02/how-to-take-a-memory-dump-of-an-asp-net-application-pool-quickly/

当我在Microsoft,我们有时遇到的问题通过分析内存转储来理解。在Pioneer和Dogfood服务器运行测试版之前的版本。如果问题很严重(崩溃、内存泄漏等(需要内存转储,这可能意味着它很快就需要了我们可以回收应用程序池并使服务器正常运行再一次

转储ASP.NET应用程序池的问题在于应用程序池使用w3wp.exe进程名称。所以,在你可以进行转储时,您需要确定哪个进程对应于目标应用程序池。如果你看不出来在进程所有者处(例如,服务帐户/应用程序池标识(。这个简单(但缓慢(的方法是打开任务管理器并添加"命令行"列。然后,您将看到w3wp.exe进程的命令行中的应用程序池名称。

应用程序池的另一个问题是消耗了大量内存,即进程将暂停很长一段时间内存被转储到磁盘。如果这需要比配置的更长的时间ASP.NET进程"ping时间",则IIS将终止您的进程(以及开始一个新的(,你会失去你的repo。

为了解决这个问题Sysinternals Procdump.exe。它利用了Windows 7/Windows的一个功能2008 R2"克隆"一个进程以进行转储并取消暂停原始过程比正常情况更快。

-r      Reflect (clone) the process for the dump to minimize the time 
the process is suspended (Windows 7 and higher only).

然后我们可以使用IIS管理工具查找一个特定的应用程序池,现在我们有了一个简单的批处理文件放在我们TFS服务器的桌面上,以便快速访问。

DumpTfsAppPool.cmd创建以下批处理文件并将其放入与Procdump.exe相同的目录。不要忘记创建/更新路径到转储位置。

%windir%system32inetsrvappcmd list wps /apppool.name:"Microsoft
Team Foundation Server Application Pool" /text:WP.NAME >
"%temp%tfspid.txt"

:: ProcDump.exe (faster, reflects/clones the process for the dump to
minimize the time the process is suspended (Windows 7 and higher
only))
for /F %%a in (%temp%tfspid.txt) do "%~dp0procdump.exe" -accepteula
-64 -ma -r %%a f:dumps pause

最新更新