我有一個.Net Framework 4.0,ASP.NET,ASP.NET MVC 3 Web應用程序託管在Windows 7/IIS 7.5上。本機啓用IIS日誌記錄,並設置爲登錄W3C模式。在ASP.NET應用程序中消耗超過65%的時間是什麼?
該應用程序通過使用發佈配置進行編譯,並已部署到IIS,並明確指定了<compilation debug='false'
屬性集。 Web.config指定使用基於SQL Server的會話狀態。
我在BeginRequest和EndRequest事件中分別在Global.asax中添加了以下語句。結果即「sw.Elapsed.TotalMilliseconds」被存儲在值的應用程序級別列表中。我通過一個調試頁面轉儲這些值,並獲得相同的平均值。
// in BeginRequest
HttpContext.Current.Items.Add("RequestStartEnd", System.Diagnostics.Stopwatch.StartNew());
// in EndRequest
var sw = (System.Diagnostics.Stopwatch)HttpContext.Current.Items["RequestStartEnd"];
sw.Stop();
我創建了一個負載測試,對20個用戶的併發用戶負載,針對此應用程序運行單個請求。該測試在Visual Studio 2010 Ultimate版本中運行。
運行負載測試後,我得到的秒錶所記錄的平均時間爲681毫秒。根據IIS對這些請求的平均時間(我在運行負載測試前清除了所有日誌)是2121毫秒。每個IIS的平均時間與Visual Studio負載測試報告中顯示的值相同。
根據IIS日誌/ Visual Studio報告,秒錶所花費的時間僅佔用時間的32%。另外68%的時間去哪裏?
更新1: 我將會話狀態設置爲InProc並重新運行負載測試。在這種情況下,秒錶報告的平均時間和IIS日誌報告的平均時間之間的差異增長到70%以上!所有這些時間在哪裏?
更新2: @Peter - 我嘗試了失敗的請求,通過把一個跟蹤規則登錄的200下一頁狀態代碼跟蹤,我跑了20個併發用戶的負載測試約1.5分鐘。通過最近的50個跟蹤文件,發現該報告中的「Time Taken」字段的範圍爲750毫秒到1300毫秒。 Visual Studio報告顯示平均值。時間爲2300ms。在報告中,使用緊湊視圖,我看到在以下轉換之間花費的時間變化: (1)AspNetStart - > AspNetAppDomainEnter (2)ManagedPipelineHandler-start ManagedPipelineHandler-end。 (2)項可能是我的應用程序的代碼。依照失敗的請求日誌(即1300ms)和平均值,最大時間仍然有很大差異。如Visual Studio 2300ms所示,耗時。如何找到這個會計?感謝這個偉大的提示!
你應該看看分析你的代碼。它將爲您提供比基於秒錶的基於性能計數器更細緻和直接可用的數據。 –
@Merlyn - 我使用的是Visual Studio 2010 Ultimate分析器。將嘗試打開「顯示所有代碼」查看報告。但是,我懷疑這個問題可能存在於IIS而不是ASP.NET中,因此可能不在分析中。懷疑背後的原因是,秒錶計時取自ASP.NET的請求開始和請求結束事件。 –
您是否考慮過ASP.NET之外的系統級因素?例如IIS開銷,網絡?增加了更詳細的答案。 –