我正在將通訊服務從運行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超時 - 沒有一個郵件被傳送。
經由控制檯輸出仿形,事實證明的電子郵件的第一「分批」是減速的來源。通過兩個線程,每個線程發送一封電子郵件,兩個線程在2200毫秒左右完成。通過四個主題,每個發送一封電子郵件,他們都在4400毫秒左右完成。八個線程,大約8800毫秒等等。似乎Web服務在同時產生時,按順序運行,並且在返回之前需要彼此等待。
任何想法可能觸發這種行爲? GitHub提供了source code for the Amazon SDK,但我一直無法確定任何可疑內容。也許使用HttpWebRequest
上的異步方法?
我現在已經嘗試過'MONO_DISABLE_AIO = 1',它在這種情況下似乎沒有改變任何東西。另外,在用調試器遍歷AWSSDK代碼之後,我還沒有遇到任何對'BeginGetResponse()'或類似的調用。我的入口點是(應該是)同步的'AmazonWebServiceClient.SendEmail()'方法。可能是我打了另一個bug,還是我忽略了一些東西? –
我能夠在一個小測試項目中使用'HttpWebRequest'上的異步方法來重現併發性能問題,這裏'MONO_DISABLE = 1'似乎也沒有幫助。這似乎表明,我確實在AWSSDK中打了一個異步方法調用,但我仍然無法找到這樣的調用。 –
MONO_DISABLE_AIO,而不是MONO_DISABLE – knocte