【问题标题】:Concurrency issue with AWS Simple Email Service on MonoMono 上的 AWS 简单电子邮件服务的并发问题
【发布时间】:2013-01-23 23:14:05
【问题描述】:

我正在将时事通讯服务从运行 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 毫秒内完成。 8 个线程,大约 8800 毫秒等。似乎 Web 服务虽然同时产生,但按顺序运行,需要在返回之前相互等待。

任何想法可能会触发此行为? source code for the Amazon SDK 可以在 GitHub 上找到,但我无法查明任何可疑之处。也许在HttpWebRequest 上使用异步方法?

【问题讨论】:

    标签: multithreading mono amazon-web-services amazon-ses


    【解决方案1】:

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

    如果你擅长处理低级代码,你最好贡献一个补丁。

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

    【讨论】:

    • 我现在尝试了MONO_DISABLE_AIO=1,在这种情况下它似乎没有任何改变。此外,在使用调试器单步执行 AWSSDK 代码后,我没有遇到任何对 BeginGetResponse() 或类似的调用。我的切入点是(据说)同步AmazonWebServiceClient.SendEmail() 方法。可能是我遇到了另一个错误,还是我忽略了什么?
    • 我能够在一个小型测试项目中使用HttpWebRequest 上的异步方法重现并发性能问题,而这里MONO_DISABLE=1 似乎也没有帮助。这似乎表明,我确实在 AWSSDK 中进行了异步方法调用,但我仍然无法找到这样的调用。
    • MONO_DISABLE_AIO,不是 MONO_DISABLE
    • 是的,这是一个错字。我运行的确切命令是 MONO_DISABLE_AIO=1 mono AwsExperiment.exe 并且设置似乎没有帮助。
    • 好的,我认为这个页面已经过时了(由于除了一个已完成的所有项目,请查看页面末尾):mono-project.com/Article:ThreadPool_Deadlocks,但也许不是。然后您可以尝试那里的解决方法,例如 export MONO_THREADS_PER_CPU=2000 或
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多