2013-01-22 16 views
1

我正在將通訊服務從運行Microsoft.NET 4.5的Windows服務器移動到運行Mono 3.0.3的Linux服務器。該服務使用亞馬遜的「簡單電子郵件服務」(SES)通過official .NET SDK(封裝REST接口)來發送電子郵件。Mono上的AWS簡單電子郵件服務的併發問題

雖然通過連續SES從單發送電子郵件原來是比Microsoft.NET稍快使用類似的硬件,我試圖以並行方式提供多種郵件時遇到了嚴重的性能問題。以下圖表顯示了在兩個平臺上使用不同數量的線程發送128封電子郵件所需的時間。正如你所看到的,Mono的性能在8個線程之後迅速降級,而128個線程我只獲得HTTP超時 - 沒有一個郵件被傳送。

Chart comparing multithreaded SES performance on Microsoft.NET and Mono

經由控制檯輸出仿形,事實證明的電子郵件的第一「分批」是減速的來源。通過兩個線程,每個線程發送一封電子郵件,兩個線程在2200毫秒左右完成。通過四個主題,每個發送一封電子郵件,他們都在4400毫秒左右完成。八個線程,大約8800毫秒等等。似乎Web服務在同時產生時,按順序運行,並且在返回之前需要彼此等待。

任何想法可能觸發這種行爲? GitHub提供了source code for the Amazon SDK,但我一直無法確定任何可疑內容。也許使用HttpWebRequest上的異步方法?

回答

0

是的,停止使用異步HttpWebRequest的*現在因爲是單色名單正在討論一個bug。補丁已經提供,但顯然不夠好,已經從主服務器恢復。

如果您對低級代碼很好,那麼您貢獻一個補丁就太好了。

*最快的方式停止使用異步架構呼喚單witht誒環境變量MONO_DISABLE_AIO = 1。順便說一句,如果你使用多個線程,或許一個Parallel.For就足夠了,但保持代碼非異步?異步的最佳用例實際上是爲了避免線程化,並仍然設法實現並行化(或者說,避免阻塞等待)。

+0

我現在已經嘗試過'MONO_DISABLE_AIO = 1',它在這種情況下似乎沒有改變任何東西。另外,在用調試器遍歷AWSSDK代碼之後,我還沒有遇到任何對'BeginGetResponse()'或類似的調用。我的入口點是(應該是)同步的'AmazonWebServiceClient.SendEmail()'方法。可能是我打了另一個bug,還是我忽略了一些東西? –

+0

我能夠在一個小測試項目中使用'HttpWebRequest'上的異步方法來重現併發性能問題,這裏'MONO_DISABLE = 1'似乎也沒有幫助。這似乎表明,我確實在AWSSDK中打了一個異步方法調用,但我仍然無法找到這樣的調用。 –

+0

MONO_DISABLE_AIO,而不是MONO_DISABLE – knocte

相關問題