2010-11-12 72 views
6

我們收到很多內存不足的異常,我們似乎無法診斷髮生了什麼。這似乎是一個問題,會發生,將內存使用量從300兆增加到幾分鐘之內的Gig。現在,這是一個IIS應用程序,並有3個應用程序域在單獨的線程池中運行。CLR內存異常

我們想記錄什麼時候內存異常即將發生。所以我們可以嘗試找到一個模式。我的問題是:做這件事的最好方法是什麼?有沒有辦法每隔一分鐘查詢內存使用情況,看看它有多高,併發送警報電子郵件。或者也許寫一個應用程序來監視CLR的內存使用情況?一個想法或方向更受歡迎。

編輯

我使用性能監視器,但除非我正在看的過程中它是沒有多大用處的。我只能看到什麼是和什麼時候。我還使用了紅門內存配置文件工具,這很棒,只是我似乎無法擊中造成異常的頁面或進程。

+0

有興趣知道你發現的是什麼 – Kev 2010-11-16 15:44:54

回答

3

在您的服務器上安裝ADPlus(它是Windows Debugging Tools的一部分)。當你開始觀察異常高的內存使用情況使用捕獲內存轉儲:

adplus -hang -p <PID> -quiet -o <dump file folder path> 

<PID>是工作進程,你可以從tasklist.exe得到的進程ID。

如果你不總是圍繞在發生,那麼你可以自動化操作捕捉使用DebugDiag內存轉儲這個問題:

  1. 使用DebugDiag資料泄漏在跟蹤模式來觸發一個進程轉儲當你的私人或Virtual內存使用達到一定的門檻。這就是說,我並不總是認爲這是可靠的。

  2. 在崩潰模式下使用DebugDiag可在每次拋出CLR異常時捕獲轉儲。您可以使用高級設置將DebugDiag配置爲在遇到類型爲System.OutOfMemoryException的CLR異常時生成完整的內存轉儲。這是更可靠,肯定會觸發。只使用高級設置 - >例外,不要觸摸未配置的第一次機會例外,將此設置保留爲無。

一旦你有你的內存轉儲啓動WinDBG,加載轉儲文件和加載SOS並開始戳。

苔絲Ferrandez的blog是一個偉大的.NET調試資源和她有很多有關如何跟蹤內存泄漏的文章和實驗室:

If it is broken, fix it you should - memory issue articles

.NET Debugging Demos Lab 6:_Memory Leak
.NET Debugging Demos Lab 6:_Memory Leak - Review
.NET Debugging Demos Lab 7: Memory Leak
.NET Debugging Demos Lab 7: Memory Leak - Review

PerfMon計數器是有用的,可以用來確認你有內存泄漏,但他們沒有講完整個故事。 WinDBG和SOS是你需要使用的工具來找出你的內存在哪裏使用。

1

嘗試RedGate Memory Profiler。我想它適用於ASP.NET網站(他們的性能分析器肯定會)。

+0

我有它是一個偉大的工具,但沒用,如果你不能重現的問題,因爲我不知道什麼系列事件導致穗是沒有幫助的。這是一個偉大的工具,不是不那麼簡單。 – 2010-11-12 12:55:13

2

Perfromance顯示器又名Perfmon是你的朋友 - 這是免費不侵擾重量輕,如果你使用不頻繁的採樣(每隔幾秒鐘),可以安全地在生產服務器上運行。它可以做的最低限度是爲您的進程(w3wp.exe)採樣內存/ CPU使用情況並將它們存儲在文件中。

既然你沒有分享你在應用程序中做什麼,我不能建議性能計數器來存儲,但有很多在ASP.NET和.NET和CLR。

由於您收到CLR內存異常,我的預感是GC不工作,由於固定對象或東西。我懷疑它是非託管資源,例如位圖,儘管可能會被釋放。

這裏有計數器的列表,我建議:

.NET CLR內存

  • GC手柄
  • 固定的對象

過程的程序w3wp.exe運行你的應用程序

  • 一對夫婦,但大多工作集

ASP.NET

  • 管理的內存使用
+0

我不認爲這是一個固定的對象,我們只在代碼中的2個區域插入對象,它們都看起來很好,但它是一個很棒的點! – 2010-11-12 12:58:23

+0

如果您的固定對象計數器升高,將很容易看到。我絕對推薦使用perfmon作爲啓動。 – Aliostad 2010-11-12 13:02:01

0

使用內存分析器。有幾個很好的例子,例如來自Red Gate的JetBrains dotTraceANTS Memory Profiler。有幾個討論在這裏stackoverflow有很多其他的提示和建議。

+0

只有當你知道通常要做什麼才能找到內存尖峯時,內存分析纔有用。 – 2010-11-12 12:56:23

0

我會用ADPlus在「崩潰」模式,以捕獲內存轉儲發生異常時,然後WinDbg中和SOS弄清楚什麼是佔用所有的內存。

+1

崩潰模式不會轉儲進程,因爲OOM異常通常不會導致工作進程崩潰。 – Kev 2010-11-13 01:25:06

+0

發生異常時,應使用「掛起」模式捕獲進程轉儲。然後轉儲分析可以顯示堆中的內容。 – 2010-11-13 02:02:06

+0

其實,我的錯誤,但你需要首先配置ADPlus配置腳本​​。在我遇到的95%的案例中,我發現DebugDiag更方便。 – Kev 2010-11-13 02:18:56

0

使用dotTrace或YourToolkit.Net您可以將分析器附加到ASP過程,它們有試用版,所以您不需要立即花錢。使用這些性能分析器,您可以選擇內存開始增加的時間線(您可以在圖形中直觀地看到內存使用情況),因此選擇範圍和理解導致內存使用情況如此之高的原因很容易。