1

我正在将时事通讯服务从运行 Microsoft.NET 4.5 的 Windows 服务器移动到运行 Mono 3.0.3 的 Linux 服务器。该服务使用 Amazon 的“简单电子邮件服务”(SES) 通过官方的 .NET SDK(包装 REST 接口)传递电子邮件。

虽然从 Mono 按顺序通过 SES 发送电子邮件比使用类似硬件的 Microsoft.NET 稍快,但在尝试并行发送多封邮件时,我遇到了严重的性能问题。下面的图表显示了使用不同数量的线程在两个平台上发送 128 封电子邮件所需的时间。如您所见,Mono 上的性能在 8 个线程后迅速下降,而在 128 个线程中,我只收到 HTTP 超时——没有发送一封电子邮件。

比较 Microsoft.NET 和 Mono 上的多线程 SES 性能的图表

通过控制台输出进行分析,结果表明第一批“邮件”是减速的根源。使用两个线程,每个线程发送一封电子邮件,两个线程在大约 2200 毫秒内完成。有四个线程,每个线程发送一封电子邮件,它们都在大约 4400 毫秒内完成。八个线程,大约 8800 毫秒等。似乎 Web 服务在同时产生时是按顺序运行的,并且需要在返回之前相互等待。

有什么想法可能会触发这种行为吗?Amazon SDK的源代码可在 GitHub 上找到,但我无法查明任何可疑之处。也许使用异步方法HttpWebRequest

4

1 回答 1

0

是的,请暂时停止使用异步 HttpWebRequest*,因为Mono 列表中正在讨论一个错误。已提供补丁,但显然不够好,已从 master 恢复。

如果您擅长低级代码,那么您最好贡献一个补丁。

* 停止使用异步基础设施的最快方法是使用环境变量 MONO_DISABLE_AIO=1 调用 mono。顺便说一句,如果您使用多个线程,也许 Parallel.For 就足够了,但要保持代码非异步?异步的最佳用例实际上是避免线程化并仍然设法实现并行化(或者更确切地说,避免阻塞等待)。

于 2013-01-23T09:26:50.407 回答