2012-06-06 41 views
4

我試圖確定一個很長的(imho)ASP.NET應用程序初始啓動的原因。ASP.NET啓動性能分析網絡

該應用程序使用各種第三方庫,並且我確信可以合併很多引用,但是,我試圖找出(並歸咎於)dll以及它們對擴展啓動過程有多大貢獻。

到目前爲止,啓動時間從2-5分鐘不等,具體取決於盒子上其他物品的使用情況。基於網站的複雜性,我認爲這是不可接受的,我需要將其降低到最多30秒的範圍內。

爲了清楚我正在尋找的性能範圍,這是從第一次請求到最初的Application_Start方法被擊中的時間。

那麼我從哪裏開始獲取關於哪些DLL被加載的信息,以及它們需要加載多長時間,以便我可以嘗試將成本/收益放在一起,以便我們需要解決/合併。從能力的角度來看,我一直在使用JetBrains dotTrace一段時間,並且我清楚如何在應用程序中對應用程序進行基準測試,但看起來這是應用程序代碼之外的,並且因此超出了我目前所知的範圍。

我在找的是關於如何在我的代碼中獲得第一個入口點之前發生的情況的方法。

注意:我知道我可以在回收/升級時調用默認頁面來執行初始加載,但我寧願解決實際問題,而不是在其上進行清理。

注2:硬件超過規模足夠大,並在功能方面分開,所以我相當肯定,這不是問題。

+3

請與「這是項目*不可接受*」或「這是*我看來不可接受*」,因爲答案將是顯着不同的決定:一個是什麼(如果有的話)做,以實現生產應用程序的目標,另一個 - 如何娛樂/教育你自己的負載性能。 –

+0

2-5分鐘的啓動時間可能會同時滿足這兩個標準。如果應用程序域回收並且服務停止2-5分鐘,我無法想象任何可以接受的開發人員*或*項目。 –

+0

我會更新的問題,這是Application_Start方法中被擊中前的時間。 – Martin

回答

2

獨立答案/調試啓動代碼:

W3WP只是運行的.Net代碼的過程。因此,您可以使用所有用於普通.Net應用程序的分析和調試工具。

一個棘手的一點是,w3wp進程的第一個請求會自動啓動一個應用程序,如果你的工具不支持連接時,它開始它使問題調查您的應用程序的啓動代碼來處理。

伎倆來解決這個問題是到另一個應用程序添加到同一個應用程序池。這樣,您可以通過導航到另一個應用程序來觸發w3wp創建,而不是針對已經運行的進程附加/配置工具。當你最終觸發你原來的應用程序工具時,會看到加載發生在現有的w3wp進程中。

用2-5分鐘耽誤你可能甚至不需要探查 - 只需連接Visual Studio調試器上面的方式提出,並隨機觸發你的網站的加載過程中「打破了所有」數次。很可能代碼的最慢部分將在多個線程之一的堆棧中。另外注意調試輸出 - 可能會給你一些線索發生了什麼。

您還可以使用WinDbg捕捉類似方式,所有線程的堆棧(可能比VS多光路)。

+0

我會嘗試其中的一些,然後一旦我確定它捕獲了正確的信息,我就會將其標記出來。 – Martin

+0

似乎是NH導致的問題...將第二個應用程序添加到相同的appPool允許我查看使用dotTrace的東西。 – Martin

0

儘管有大量的dll,我幾乎可以肯定,對於一個合理的應用程序,它不能成爲問題的原因。大多數情況下,靜態對象的初始化會導致啓動緩慢。

在C#中靜態變量在初次訪問類型時被初始化。我建議使用sql分析器,並查看在應用程序啓動時執行的查詢是什麼,並從那裏看到什麼是初始化昂貴的對象。

+0

這是我已經採取的路線,並且似乎沒有成爲可能很多,而其中沒有任何攫取巨大的數據集。 – Martin

2

您的DLL引用會根據需要加載,而不是一次加載。

Do external references slow down my ASP.NET application? (VS: Add Reference dialog)

如果啓動時服用2-5分鐘,我想看看在的Application_Start會發生什麼,在做什麼,一旦加載的DLL。他們是否試圖連接到非常慢的遠程服務?該機器是否太小而無法運行(例如,運行帶有大量數據的數據庫以及AWS微型實例等上的Web服務器)?由於加載時間可能不是IIS工作進程解析引用,所以我會轉向傳統的應用程序分析器(例如Jetbrains,Antz,dotTrace),以查看在DLL初始化時以及在Application_Start中花費的時間方法。

+0

我用dotTrace來分析從的Application_Start開始的代碼,但它需要2-5分鐘,達到這一點。也許我沒有設置正確的dll的初始化? – Martin

+0

你是否控制(主要)DLL的來源?如果是這樣,你可以添加一些簡單的日誌語句......不幸的是,在年齡方面還沒有使用dotTrace。 –

+0

我做控制網站的代碼,不幸的是,這個問題似乎站點代碼之前。否則,我會認爲dotTrace會捕獲它。 – Martin

1

娛樂選擇檢查以及分析:

  • 輪廓的一切,加上時間跟蹤一切,日誌信息
  • ,如果你有需要在啓動時收集了很多ASPX的意見(我認爲這是默認爲發佈配置)比需要一些時間
  • 引用Web服務或其他XML序列化相關的代碼將需要編譯序列化程序集,如果沒有任何存在尚未
  • 訪問遠程服務(包括lo CAL SQL)可能需要的服務啓動中的應用也
  • 積極的緩存/遠程服務可能需要緩存
  • 的每個人口

生產:

  • 什麼是啓動時間的目標是什麼?先找出它,否則你將無法達到它。
  • 什麼是您願意支付的價格以減少啓動時間。增加1-10個服務器可能比花費數月的開發/測試時間和延遲產品便宜。
  • 考慮多臺服務器,用溫水電話滾動重新啓動,Web園
  • 如果數據庫對象的或一般的緩存問題考慮現有的分佈式內存緩存......上分析
+0

+1,不錯的列表... –

+0

我喜歡這個列表,第一個列表有一些我沒有考慮過的東西(Serialization集合,編譯ASPX頁面)。然而,我正在尋找的是能夠了解每個列表與整個啓動過程相關的成本。 – Martin

+0

我已經發布了關於調試/配置文件ASP.Net啓動的單獨答案。 –