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

时间:2018-07-27 03:59:47

标签: production-environment dotmemory

我有一个内存泄漏,仅在生产中出现(一个Webapp(Asp.Net MVC))。

我想用dotMemory(或类似的工具)拍摄内存快照,以查看发生了什么事情。

但是我不确定这是否会导致生产暂停并弄乱当前的所有请求。

之前我在计算机上有32 gb的RAM

所以我的问题是:

我可以在没有恶意阻止/影响请求的情况下获取内存快照吗?

1 个答案:

答案 0 :(得分:1)

是的,dotMemory和任何其他通过Microsoft Profiling 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/

  

当我在以下位置运行内部Team Foundation Server(TFS)时   微软,有时我们遇到的问题可能只是   通过分析内存转储可以理解。特别是在   运行Beta版之前的Pioneer和Dogfood服务器。如果   问题足够严重(崩溃,内存泄漏等)   需要一个内存转储,这可能意味着它需要很快,所以   我们可以回收应用程序池并使服务器健康   再次。

     

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

     

消耗大量资源的应用程序池的另一个问题   记忆,是该进程将被长时间暂停   内存转储到磁盘。如果花费的时间比配置的时间长   ASP.NET进程“ ping time”,然后IIS将终止您的进程(并且   在转储进行到一半时重新开始),您将失去复制权。

     

要解决该问题,请在   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管理工具来查找以下进程的ID:   一个特定的应用程序池,现在我们有一个简单的批处理文件,我们可以   放在我们的TFS服务器的桌面上以便快速访问。

     

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

%windir%\system32\inetsrv\appcmd 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 "%~dp0\procdump.exe" -accepteula
-64 -ma -r %%a f:\dumps pause