Microsoft.NET 4.5 を実行している Windows サーバーから Mono 3.0.3 を実行している Linux サーバーにニュースレター サービスを移行中です。このサービスは、Amazon の "Simple Email Service" (SES) を使用して、公式の .NET SDK (REST インターフェイスをラップ)経由でメールを配信します。
Mono から SES 経由で順次メールを送信すると、同様のハードウェアを使用する Microsoft.NET よりもわずかに高速であることが判明しましたが、複数のメールを並行して配信しようとすると、深刻なパフォーマンスの問題が発生します。以下は、さまざまな数のスレッドを使用して、両方のプラットフォームで 128 通の電子メールを送信するのに必要な時間を示すグラフです。ご覧のとおり、Mono のパフォーマンスは 8 スレッドを超えると急速に低下し、128 スレッドでは HTTP タイムアウトのみが発生し、メールは 1 つも配信されません。
コンソール出力によるプロファイリングでは、メールの最初の「バッチ」がスローダウンの原因であることが判明しました。2 つのスレッドでそれぞれ 1 つのメールを送信すると、両方のスレッドが約 2200 ミリ秒で終了します。4 つのスレッドがあり、それぞれに 1 つのメールを送信すると、すべて約 4400 ミリ秒で終了します。8 つのスレッド、約 8800 ミリ秒など。Web サービスは、同時に生成されている間、順次実行され、戻る前に互いに待機する必要があるようです。
この動作を引き起こしている可能性のあるアイデアはありますか? Amazon SDKのソース コードは GitHub で入手できますが、疑わしいものを特定することはできませんでした。たぶん、での非同期メソッドの使用HttpWebRequest
ですか?