1

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 つも配信されません。

Microsoft.NET と Mono でのマルチスレッド SES パフォーマンスを比較するグラフ

コンソール出力によるプロファイリングでは、メールの最初の「バッチ」がスローダウンの原因であることが判明しました。2 つのスレッドでそれぞれ 1 つのメールを送信すると、両方のスレッドが約 2200 ミリ秒で終了します。4 つのスレッドがあり、それぞれに 1 つのメールを送信すると、すべて約 4400 ミリ秒で終了します。8 つのスレッド、約 8800 ミリ秒など。Web サービスは、同時に生成されている間、順次実行され、戻る前に互いに待機する必要があるようです。

この動作を引き起こしている可能性のあるアイデアはありますか? Amazon SDKのソース コードは GitHub で入手できますが、疑わしいものを特定することはできませんでした。たぶん、での非同期メソッドの使用HttpWebRequestですか?

4

1 に答える 1

0

はい、 Mono リストで議論されているバグがあるため、今のところ async HttpWebRequest* の使用をやめてください。パッチが提供されましたが、明らかに十分ではなく、マスターから戻されました。

低レベルのコードが得意な方は、パッチを提供していただけると助かります。

* 非同期インフラストラクチャの使用をやめる最速の方法は、環境変数 MONO_DISABLE_AIO=1 を指定して mono を呼び出すことです。ところで、とにかく複数のスレッドを使用している場合は、おそらく Parallel.For で十分ですが、コードは非同期のままにしておく必要がありますか? 非同期の最良の使用例は、実際にはスレッド化を回避し、それでも並列化を達成することです (または、ブロッキング待機を回避します)。

于 2013-01-23T09:26:50.407 に答える