我正在将新闻稿服务从运行Microsoft.NET 4.5的Windows服务器移动到运行Mono 3.0.3的Linux服务器。该服务使用亚马逊的“简单电子邮件服务”(SES)通过official .NET SDK(包装REST界面)发送电子邮件。
虽然从Mono顺序通过SES发送电子邮件的结果比使用类似硬件的Microsoft.NET略快,但在尝试并行发送多封邮件时,我遇到了严重的性能问题。下面的图表显示了使用不同数量的线程在两个平台上发送128封电子邮件所需的时间。正如您所看到的,Mono上的性能在8个线程之后迅速降级,并且在128个线程中我只获得HTTP超时 - 没有提供单个电子邮件。
通过控制台输出进行分析,结果发现邮件的第一批“批次”是减速的来源。使用两个线程,每个线程发送一封电子邮件,两个线程在大约2200毫秒内完成。有四个线程,每个发送一封电子邮件,它们都在4400毫秒左右完成。八个线程,大约8800毫秒等等。似乎Web服务虽然同时生成,但是按顺序运行并且需要在返回之前等待彼此。
任何可能触发此行为的想法? source code for the Amazon SDK可以在GitHub上找到,但我无法确切地指出任何问题。也许在HttpWebRequest
上使用异步方法?
答案 0 :(得分:0)
是的,暂时停止使用异步HttpWebRequest *,因为Mono列表中正在讨论bug。已经提供了一个补丁,但显然不够好,已经从主人那里恢复了。
如果您对低级别代码很好,那么您可以提供补丁。
*停止使用异步基础架构的最快方法是使用环境变量MONO_DISABLE_AIO = 1调用mono。顺便说一下,如果你还在使用多个线程,也许是Parallel.For就足够了,但保持代码非异步?异步的最佳用例实际上是避免线程并仍然设法实现并行化(或者更确切地说,避免阻塞等待)。