我有一个内存泄漏,仅在生产中出现(一个Webapp(Asp.Net MVC))。
我想用dotMemory(或类似的工具)拍摄内存快照,以查看发生了什么事情。
但是我不确定这是否会导致生产暂停并弄乱当前的所有请求。
之前我在计算机上有32 gb的RAM
所以我的问题是:
我可以在没有恶意阻止/影响请求的情况下获取内存快照吗?
答案 0 :(得分:1)
是的,dotMemory和任何其他通过Microsoft Profiling API工作的内存分析器将使应用暂停一段时间,从几毫秒到几分钟不等,具体取决于内存中的数据量。
我建议采取标准的Windows内存转储,在正常情况下也需要一些时间,但是有一种技术可以避免这种情况。 然后,您可以在dotMemory或任何其他支持Windows内存转储的工具中对其进行分析。
当我在以下位置运行内部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