我正在将时事通讯服务从运行 Microsoft.NET 4.5 的 Windows 服务器移动到运行 Mono 3.0.3 的 Linux 服务器。该服务使用 Amazon 的“简单电子邮件服务”(SES) 通过官方的 .NET SDK(包装 REST 接口)传递电子邮件。
虽然从 Mono 按顺序通过 SES 发送电子邮件比使用类似硬件的 Microsoft.NET 稍快,但在尝试并行发送多封邮件时,我遇到了严重的性能问题。下面的图表显示了使用不同数量的线程在两个平台上发送 128 封电子邮件所需的时间。如您所见,Mono 上的性能在 8 个线程后迅速下降,而在 128 个线程中,我只收到 HTTP 超时——没有发送一封电子邮件。
通过控制台输出进行分析,结果表明第一批“邮件”是减速的根源。使用两个线程,每个线程发送一封电子邮件,两个线程在大约 2200 毫秒内完成。有四个线程,每个线程发送一封电子邮件,它们都在大约 4400 毫秒内完成。八个线程,大约 8800 毫秒等。似乎 Web 服务在同时产生时是按顺序运行的,并且需要在返回之前相互等待。
有什么想法可能会触发这种行为吗?Amazon SDK的源代码可在 GitHub 上找到,但我无法查明任何可疑之处。也许使用异步方法HttpWebRequest
?