我有一个内存泄漏,只有在生产中( webapp (Asp.Net MVC))。
我想用dotMemory (或类似于它的工具)拍摄一个内存快照,看看到底发生了什么。
然而,我不确定这是否会导致生产暂停和混乱任何当前的要求。
我在机器上有32 gb的RAM
所以我的问题是:
我可以获得一个内存快照而不被对方阻塞/影响请求吗?
发布于 2018-07-27 07:07:44
是的,dotMemory和任何其他通过Microsoft工作的内存分析器都会暂停应用程序一段时间,从毫秒到分钟,这取决于内存中的数据数量。
我建议使用一个标准的Windows内存转储,在正常情况下也需要一些时间,但是有一种技术可以帮助避免它。然后,您可以在dotMemory或任何其他支持Windows转储的工具中分析它。
当我在微软运行内部(TFS)时,我们有时会遇到一些只能通过分析内存转储才能理解的问题。这在先驱者和狗食服务器上尤其如此,这些服务器运行的是前Beta版本。如果问题足够严重(崩溃、内存泄漏等),需要一个内存转储,这可能意味着它需要它,以便我们可以循环应用程序池,使服务器恢复正常。 转储ASP.NET应用程序池的问题是,所有应用程序池都使用w3wp.exe进程名。因此,在进行转储之前,需要确定哪个进程对应于所针对的应用程序池。如果您无法通过查看流程所有者(例如服务帐户/应用程序池标识)来判断。简单(但速度慢)的方法是打开任务管理器并将“命令行”列添加到显示中。然后,您将在w3wp.exe进程的命令行中看到每个应用程序池名称。 占用大量内存的应用程序池的另一个问题是,当内存被转储到磁盘时,进程将被挂起很长时间。如果这比配置的ASP.NET进程“ping时间”花费的时间更长,则IIS将在转储过程的中途终止您的进程(并启动一个新的进程),您将失去您的复制程序。 为了解决这个问题,Sysinternals Procdump.exe中有“-r”标志可用。它利用了Windows7/Windows2008R2的一个功能,即“克隆”一个进程以获取转储,并以比正常更快的速度解除原始进程。
-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 pausehttps://stackoverflow.com/questions/51550574
复制相似问题