2013-05-08 91 views
0

我有小型(x2)云服务运行正常并且运行良好4-6天,但随后它变得无响应,并且需要通过Azure门户手动重新启动以使其恢复联机。Azure服务在几天后死亡

Windows事件日志显示虚拟内存不足。 2-3天后,我开始得到:

Windows成功诊断出低虚拟内存条件。 以下程序消耗了最多的虚拟内存:WaIISHost.exe (3836)消耗3810709504个字节,CacheService.exe(1528)消耗 823902208个字节,w3wp.exe(1728)消耗145485824个字节。

一段时间后,服务启动失败(由于内存不足的问题?):

应用:CacheService.exe Framework版本:v4.0.30319
说明:该工艺由于终止未处理的 异常。例外的信息: Microsoft.ApplicationServer.Caching.ConfigStoreException
堆栈:在 Microsoft.ApplicationServer.Caching.CustomProviderProxy + <> C_ DisplayClass5.b _3(System.Object的)
在 System.Threading.ExecutionContext.Run( System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object的,布尔值)处 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在System.Threading.ThreadPoolWorkQueue.Dispatch()的System.Threading。 ThreadPoolWaitCallback.PerformWaitCallback()
| HTTP://schemas.microsoft.com/win/2004/08/events/event'> 1026200x800000000000001138ApplicationRD00155D45A2ADApplication: CacheService.exe Framework版本:v4.0.30319说明: 该过程终止,因为到未处理的异常。
异常信息: Microsoft.ApplicationServer.Caching.ConfigStoreException
堆栈:在 Microsoft.ApplicationServer.Caching.CustomProviderProxy + < >Ç
_DisplayClass5。 <PerformOperation> b__3(System.Object的)
处 System.Threading.QueueUserWorkItemCallback.System System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object的,布尔值)。 Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在System.Threading.ThreadPoolWorkQueue.Dispatch()在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

,并最终Http请求启动失败:

进程信息:
进程ID:3344
进程名称:w3wp。EXE
帐户名:NT AUTHORITY \ NETWORK SERVICE
异常信息:
异常类型:HttpException
异常消息:分页文件太小,无法完成操作。在 System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()
在System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
在System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager AppManager的:(0x800705AF从HRESULT异常) ,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel,Exception appDomainCreationException)
页面文件太小,无法完成此操作。 (从HRESULT异常:0x800705AF)

我不知道,如果问题是虚拟内存配置过低,或者是利用内存太高。 WaIISHost.exe虚拟内存使用肯定看起来相当高,但它似乎稳定在4.1 GB左右。

我不知道为什么WaiISHost.exe需要这么多,因为Run()方法只是在做非常轻松的内务处理活动,比如每隔几分钟对网站执行ping操作以保持应用程序在白天运行。

Azure Portal中的可用内存监视显示该服务在崩溃之前的整个时间段内具有300-800MB的可用内存。

任何想法是什么问题?我如何配置更高的虚拟内存?

+1

你显然有某种内存泄漏。你保留的任何变量(静态或其他)?日志?收藏?甚至可能通过依赖注入框架创建一些东西?与此同时,您总是可以编写一个简单的PowerShell脚本来每晚重新启动实例,直到找出结果。 – Jaxidian 2013-05-08 17:24:34

回答

8

您的应用程序代码中的内存泄漏,你正赶上在Azure的例外只是从我的经验不多的,因为应用程序代码的存储环境中消耗所有的它,效果之后。

正常情况下,当我将RDP放入盒子时,识别出存在内存泄漏的进程,然后使用Redgate工具(或任何其他工具)启动代码分析会话。然后使用该工具运行半天的流程,您应该轻松确定问题所在。

你可能会发现我会猜测这就像是一个异常,导致你的代码无法正确清理。这将解释为什么在几天和几个例外之后你会看到这个问题。我会看你的异常处理和清理代码。您应该测试代码库中的断开连接以及可能影响代码的其他瞬态位置。

我还会坚持像newrelic或foglight这样的事情,以便您清楚地知道您的代码/ Azure实例即将失败,您还可以查看失败时的时间尺度,以及是否可以获取更多的日志信息。有什么会导致您遇到的问题。

+0

尽管@JamesKn只有1个StackOverflow点,但这是非常好的建议!听詹姆斯! – Jaxidian 2013-05-08 20:41:46

+0

感谢您提供一个很好的建议和指向好工具的指针。 Redgate ANTS确实有助于调试内存泄漏。 – user1969169 2013-05-14 10:05:18