2012-06-19 61 views
0

在我的Azure角色啓動代碼中,我實例化了一個DCOM對象,以確保它可以實例化,然後立即釋放它,因爲在那時我並不需要它。在縮放Azure角色時,實例化DCOM對象有時會掛起

我這樣做,在一個單獨的線程實際new S中的相應的C#RCW類和主線程Thread.Join() s的一個30秒的超時該線程。如果線程在Thread.Join()返回後仍然運行,則意味着DCOM對象花費很長時間創建,因此調用Thread.Abort()並重新啓動角色。 30秒應該足夠了 - 該對象是輕量級的,並且在實例化時不會耗費任何時間。

該代碼工作得很好,直到我試圖大幅度擴展我的服務。我要求支持解除計算核心配額並嘗試擴展到100個(100個)實例。

現在大多數實例都開始正常工作,但其中一些實際上面臨上述情況 - DCOM對象創建時間過長,代碼拋出異常,導致角色重新啓動。

我重複了幾次測試。一旦我要求擴大幾十個實例,問題就會在一些新開始的實例中被複制。由於所有的實例是統一的,我不知道是什麼可能導致這種行爲。

什麼可能是DCOM對象在某些情況下花費這麼長時間的原因?

+0

您可能需要共享更多,但這聽起來像是一種競爭條件(或其他類型的計時錯誤)。您運行的實例越多,您在代碼中遇到競爭條件的機會就越大。我不希望它是關於「一些實例」,而是關於「有時我執行此代碼」。 – smarx

+0

@smarx:看起來像一般的「一切都很好」的條件 - 我已經添加了一個答案。 – sharptooth

回答

0

到目前爲止,我的研究表明,當我通過大量實例進行擴展時,某些實例在啓動時刻附近會變得非常糟糕,特別是在IO界限操作方面。我認爲這是因爲虛擬機運行的主機(8核硬件服務器)正在做一些繁重的工作,所以對IO的競爭非常激烈。在這些情況下,實例化一個通常需要1秒鐘的DCOM對象可能需要長達40秒,而我的超時時間應該會增加。