2012-07-25 23 views
1

我們遇到了IIS和Azure非常嚴重的問題。不知道這是IIS端還是我們的自定義代碼端。當Azure緩慢時,IIS隊列填滿並不能恢復

我參與了在Azure中運行的兩個網站(站點A和站點B)。 (標準WebRoles,ASP.NET MVC3)。這兩個網站的架構完全不同,並且與另一個網站無關,但在類似情況下,兩者都顯示出類似的行爲。

站點A在啓用會話狀態的情況下運行。會話存儲在SQL Azure數據庫中。大多數對站點A的調用都通過指向SQL Azure數據庫的ASP.NET SQL成員資格提供程序進行安全保護。

站點B也在啓用會話狀態的情況下運行。會話存儲在Azure AppFabric緩存中。站點B還有一個http處理程序,可與AppFabric緩存和Azure表存儲進行對話。

當關鍵的Azure資源(如SQL Azure或Cache)變得非常緩慢時,問題就開始了,但不會恢復。當這些資源變得非常慢並且每個請求的處理時間超過一分鐘時,Azure的負載平衡器會終止這些連接,但Web角色上的IIS不會將這些請求從其活動隊列中清除/刪除。

因此,當SQL Azure或AppFabric Cache速度非常慢時,問題不在於網站沒有響應。最大的問題是當SQL Azure或AppFabric Cache回來並開始正常工作時,網站不能恢復。請求位於「活動請求」列表中,並且不會長時間(幾小時?)消失。坦率地說,我不知道他們坐在那裏多久,因爲我們儘快重啓這些服務器。由於Azure資源偶爾會出現間歇性問題,並且由於兩個站點的流量都非常高,因此這兩個站點在非清理請求的壓力下快速陷入困境。 IIS隊列填滿,直到有人進入並重新啓動應用程序池,這些站點不可用。

回答

0

我也有類似的問題,IIS請求這將持續很長時間。我花了很長時間試圖弄清IIS爲什麼不殺死它們。我嘗試了Sandrino Di Mattia的解決方案和其他方法,其中沒有一個適合我。

事實證明,IIS沒有處理請求,因爲它們仍然處於活動狀態。在某些情況下,客戶端瀏覽器會打開一個連接並永遠保留它。我會在瀏覽器的網絡調試器(Firebug,Webkit檢查器等)中查看剛剛在那裏旋轉的請求。據我可以告訴他們正在響應keepalive,所以IIS和負載平衡器會保持連接和請求活動。最終的解決方案是讓瀏覽器不這樣做。

它可能與您的問題沒有關係,但在我的特殊情況下,問題是<video>標籤。當給定<video>標籤指向一個大文件時,他們會立即打開連接並保持它直到播放視頻,這可能永遠不會(我們關閉了自動播放功能)。解決方案是在我們準備播放視頻之前不會創建<video>標籤。

另外,有沒有辦法知道Azure負載平衡器已經殺死了一個請求?我知道看到活動的唯一方法是請求通過IIS管理控制檯。

2

IIS保持請求'活着'的事實非常奇怪。您是否嘗試過將請求超時配置爲少於60秒?這樣做會留下IIS控制殺死,而不必負載平衡器關閉連接的請求,:

<httpRuntime executionTimeout="50" /> 

注:這僅適用於在調試=假

+0

謝謝!這是一個好主意,會嘗試 – Igorek 2012-07-25 18:55:36