2013年10月21日

[Azure]Role instance recycling、stuck in Busy/Unhealthy status

最近常常接到客戶反映類似的問題;通常這類的問題大概有幾個可能:

  1. 在Startup Task裡遇到問題,例如要跑的Script出錯(Exit code != 0),或是要安裝的元件安裝失敗等等。
  2. 在OnStart()裡面遇到問題,例如沒有處理Exception等
  3. 該reference的assembly沒有佈署到雲端上
  4. Windows Azure資料中心裡的問題

有幾個簡單方式可以讓我們快速的確認一下問題可能發生的原因。

  • 首先,為了要了解到底發生甚麼事情,先到Windows Azure Portal上啟用遠端連線(RDP),這可以在Cloud Service->你的服務->設定->遠端來做設定

image

  • 接下來RDP到出問題的Role Instance上。首先檢查一下C:\Logs裡的WaBootStrapper.log是不是有看到甚麼問題?
    • 一般來說,如果是Startup Task沒有執行完畢導致Role Recycle,在這裡應該可以看到Log的最後一行是停在執行Startup Task,且可以在這裡看到是哪一個Task無法完成。此時可以跟E:\或是F:\的RoleModel.xml來比對Startup Task的相關資料。
  • 接著可以檢查Task Manager裡面,WaIISHost.exe或是WaWorkerHost.exe是不是有正常執行?
    • WaIISHost與WaWorkerHost是Role Instance的Host Process,他們會先載入E:\或是F:\下的__RoleEntry這個檔案中所指定的Role Entry,如果無法載入,Role Instance也就無法順利啟動。
    • 如果需要Debug WaIISHost.exe與WaWorkerHost.exe,可以透過Windbg來attach到該process然後看看是否有甚麼錯誤。
  • 打開Event Viewer,看看裡面有沒有甚麼明顯的訊息。
    • 如果程式有丟出Exception,可以在這裡看到。
  • 瀏覽本機網頁,看看網站是不是有回報錯誤。
    • 如果看到Could not load xxx assembly or its depencies;表示網站所需要的DLL 沒有佈署到雲端上,這時要回到Visual Studio中將所有reference到的DLL都設定Copy Local,並確認該安裝的元件都有包在package裡面。

幾個比較常遇到的問題跟一般的Troubleshooting:

  1. 發現WaIISHost不斷重啟時,表示某些需要的DLL找不到;這時可以打開網頁(如果是Web Role)瀏覽本機,通常這裡可以看到是哪個DLL或他相關的DLL找不到,這時就要回去source code看一下可能少了甚麼。
  2. 發現WaBootstrapper.log停在startup task時,如果該startup task是個script,則可以將該script全部remark掉,然後用Task Manager把WaBootstrapper.exe砍掉,等他重啟後,看看問題有沒有解決。
  3. 如果Event Viewer裡就可以看到Unhandled Exception,請回到source code檢查可能出錯的地方。
  4. 另外要特別注意,雲端上只支援64位元的程式,所有的程式請務必compile為Any CPU。
  5. 如果以上皆非,那麼請快樂的聯絡微軟技術支援吧。

About Me