2017年3月1日 星期三

如何進行App Service for Web問題排除

網站發生問題時,往往都會手忙腳亂,雖然Azure有提供良好的服務可以直接請工程師進行問題的排除(Azure Technical Support),但有時候問題的情況過了之後就需要再等待問題的重現,所以我們本篇就介紹一些基本的排除方式,在第一時間發生時,即可以收集並進行初步的分析與問題排除,另外也可以將收集到的資訊提供給專業的微軟工程師進行初步的分析,藉以快速的找出問題。

其實當問題發生時,可以先初步的確認Azure Service Status的網站,確認此次的問題是否可能與Azure本身的服務有關,當如果真的是Azure本身發生問題時,通常發生問題會以Data Center為區域性影響,網站上也會進行公告,但有時候可能公告訊息不一定會立即列出問題的區域,如果沒有顯示會並非Azure本身的問題的話,我們接下來後續的處理。

基本上App Service for Web(Windows)本身的核心就是IIS,所以我們可以透過一些IIS的除錯方式進行處理,另外在問題除錯上,非常不建議在正式的網站啟用Remote Debug Mode進行,因為會造成網站整個被咬住,造成許多問題。

建議如果可以的話,可以嘗試在Deployment Slot新增一個測試站台,然後再透過此測試網站進行遠端除錯,老話一句正式環境不到最後一步,儘可能不要使用遠端除錯的方法。

可能的問題情況:
1、Azure Portal介面操作無法完成,出現錯誤等情況。

1-1 請先嘗試將語言與地區格式切換至英文(English)後,再進行確認。
1-2 如果都無法完成你要的作業時,此時建議可以將錯誤畫面截圖並將操作過程透過瀏覽器的開發者工具(F12)或是透過Fiddler進行收集,並在Azure Portal上建立Support Request請微軟的工程師進行協助。

2、網頁無法顯示或是顯示錯誤訊息為500、50x類型:

2-1 請確認空白網頁(html)是否也會有相同的情況。
2-2 請確認下列的#a收集網站的詳細錯誤訊息,確已確認問題為何。
2-3 透過下列的#b的方式進行memory dump的捉取,並再進行分析找出問題。

3、特定網頁開啟緩慢

3-1 請確認空白網頁(html)是否也會有相同的情況。
3-2 透過Application Insights觀察目前網站的情況,藉以確認是否網站無法負荷,可以嘗試增加Instance,藉以加快處理。
3-3 如果程式語言為.net時,建議可以透過下列的方式在程式中加入執行計時分析,藉以找出真正慢的區塊為何。

Stopwatch 類別
https://msdn.microsoft.com/zh-tw/library/system.diagnostics.stopwatch(v=vs.110).aspx

3-4 在網頁過慢的時候,透過Hang Dump的方式建立Memory Dump,藉以分析當下網站主要的問題為何。

4、網頁發生列外狀態(Exception)。

4-1 透過Application Insight可以收集到程式是否有產生Exception。
4-2 透過#a的log可以知道是那一支程式發生Exception。
4-3 在有問題的程式區塊透過Try-Catch進行例外的捉取,
4-4 透過#c的方式主動觀察網站,並產生Exception Dump。

PS:如果你的網站有多個網頁都有發生例外時,可能你會收到太多種的Exception Dump,所以可能會收到的檔案並非預期頁面的檔案,這時就要分析這些檔案的資訊,再逐一解決這些問題。

5、CPU High

5-1 透過Application Insights觀察目前網站的情況是否正常,如流量與CPU比率等。
5-2 當問題發生時透過#b的方式進行Hang Dump的產生,再進行分析。
5-3 問題發生時可能無法當下手動產生,可以透過#c的方式進行自動監控,藉以當CPU超過一定的比率時,自動產生Hang Dump File,

6、網站發生Crash

6-1 透過後台觀察網站有自動進行重啟。
6-2 透過Application Insights發現網站有重啟的情況。
6-3 透過#c的方式自動觀察網站,當發生Crash時,即會自動產生Crash Dump。

資訊收集:
a. 啟用詳細的Log File與Failed Request Tracing

這個其實就是捉取IIS的Log File,另外也可以透過Failed Request Tracing當問題發生時詳細記錄錯誤訊息。

在 Azure App Service 中針對 Web 應用程式啟用診斷記錄功能
https://docs.microsoft.com/zh-tw/azure/app-service-web/web-sites-enable-diagnostic-log

b. 將網站手動產生Memory Dump

登入SCM的後台,選擇 Tools -> Diagnostic dump即可產生Memory Dump,千萬記住在產生時,系統會全部暫時凍結住,所以會影響前端的操作,這部份再請注意。

Using KUDU with Microsoft Azure Web Apps
https://blogs.msdn.microsoft.com/benjaminperkins/2014/03/24/using-kudu-with-windows-azure-web-sites/

c. 透過網站的擴充功能(Extensions)啟用自動監控,即可當網站發生預期的問題時,即可自動產生Memory Dump。

假設我們啟用監控CPU當超過60%又超過10秒時,自動產生Memory Dump。

從網站的處理序總管即可看到會有二個新增的Process,名稱為CrashDiagnoserProcDump,當設定的條件達到時,即會自動產生。

How to capture and analyze a dump file when intermittent High CPU happens on Azure Web Apphttps://blogs.msdn.microsoft.com/asiatech/2016/01/20/how-to-capture-dump-when-intermittent-high-cpu-happens-on-azure-web-app/

d. 分析Memory Dump。

基本上對底層架構沒有一定的熟悉時,是很難可以自行分析的,但其實我們可以過一些方式簡單的進行分析,如果還是不行的話,其實還是可以透過Support Request請微軟的工程師進行分析。

net 程式進階除錯教學 - 使用WinDbg
http://caryhsu.blogspot.tw/2011/11/net-windbg.html

Analyze a memory dump using the Debug Diagnostic tool
https://blogs.msdn.microsoft.com/benjaminperkins/2016/02/01/analyze-a-memory-dump-using-the-debug-diagnostic-tool/

Using Visual Studio 2013 to Diagnose .NET Memory Issues in Production
https://blogs.msdn.microsoft.com/visualstudioalm/2013/06/20/using-visual-studio-2013-to-diagnose-net-memory-issues-in-production/


關鍵字:AzureWeb AppsApp Service for WebTroubleshooting問題排除Memory Dump