【问题标题】:azure queue performance天蓝色队列性能
【发布时间】:2012-10-16 13:18:32
【问题描述】:

对于 Windows azure 队列,每个存储的可扩展性目标应该是大约 500 条消息/秒 (http://msdn.microsoft.com/en-us/library/windowsazure/hh697709.aspx)。我有以下简单的程序,它只是将一些消息写入队列。该程序需要 10 秒才能完成(4 条消息/秒)。我正在从虚拟机内部(在西欧)运行该程序,并且我的存储帐户也位于西欧。我没有为我的存储设置异地复制。我的连接字符串设置为使用 http 协议。

       // http://blogs.msdn.com/b/windowsazurestorage/archive/2010/06/25/nagle-s-algorithm-is-not-friendly-towards-small-requests.aspx
        ServicePointManager.UseNagleAlgorithm = false;

        CloudStorageAccount storageAccount=CloudStorageAccount.Parse(ConfigurationManager.AppSettings["DataConnectionString"]);

        var cloudQueueClient = storageAccount.CreateCloudQueueClient();

        var queue = cloudQueueClient.GetQueueReference(Guid.NewGuid().ToString());

        queue.CreateIfNotExist();
        var w = new Stopwatch();
        w.Start();
        for (int i = 0; i < 50;i++ )
        {
            Console.WriteLine("nr {0}",i);
            queue.AddMessage(new CloudQueueMessage("hello "+i));    
        }

        w.Stop();
        Console.WriteLine("elapsed: {0}", w.ElapsedMilliseconds);
        queue.Delete();

知道如何获得更好的性能吗?

编辑:

根据 Sandrino Di Mattia 的回答,我重新分析了我最初发布的代码,发现它不够完整,无法重现错误。事实上,我在调用 ServicePointManager.UseNagleAlgorithm = false; 之前创建了一个队列。重现我的问题的代码看起来更像这样:

        CloudStorageAccount storageAccount=CloudStorageAccount.Parse(ConfigurationManager.AppSettings["DataConnectionString"]);

        var cloudQueueClient = storageAccount.CreateCloudQueueClient();

        var queue = cloudQueueClient.GetQueueReference(Guid.NewGuid().ToString());

        //ServicePointManager.UseNagleAlgorithm = false; // If you change the nagle algorithm here, the performance will be okay.
        queue.CreateIfNotExist();
        ServicePointManager.UseNagleAlgorithm = false; // TOO LATE, the queue is already created without 'nagle'
        var w = new Stopwatch();
        w.Start();
        for (int i = 0; i < 50;i++ )
        {
            Console.WriteLine("nr {0}",i);
            queue.AddMessage(new CloudQueueMessage("hello "+i));    
        }

        w.Stop();
        Console.WriteLine("elapsed: {0}", w.ElapsedMilliseconds);
        queue.Delete();

Sandrino 建议的使用 app.config 文件配置 ServicePointManager 的解决方案的优点是 ServicePointManager 在应用程序启动时被初始化,因此您不必担心时间依赖性。

【问题讨论】:

  • 如果从循环中删除 Console.WriteLine() 会怎样?
  • 那么它会快几毫秒,但仍然在 4 条消息/秒左右。
  • 我认为500/s是单个Queue的整体扩展性能,不一定是串行读/写。单个线程不是如何扩展的,所以可能是您的往返延迟。您可以切换到异步或尝试批处理操作吗? msdn.microsoft.com/en-us/library/windowsazure/hh528527.aspx

标签: c# performance azure


【解决方案1】:

几天前我回答了一个类似的问题:How to achive more 10 inserts per second with azure storage tables

在表存储中添加 1000 个项目需要 3 多分钟,而随着我在回答中描述的更改,它下降到 4 秒(250 个请求/秒)。最后,表存储和存储队列并没有什么不同。后端是相同的,数据只是以不同的方式存储。表存储和队列都通过 REST API 公开,因此如果您改进处理请求的方式,您将获得更好的性能。

最重要的变化:

  • expect100Continue: 错误
  • useNagleAlgorithm: false(你已经在这样做了)
  • 并行请求结合connectionManagement/maxconnection

【讨论】:

  • 我尝试了您的建议,它立即奏效(使用您其他帖子中的 system.net 配置部分)。谢谢!但是,我很好奇为什么我的代码在没有更改 app.config 的情况下无法正常工作,毕竟我也以编程方式将 nagle 算法设置为 false。我发现,当您以编程方式配置 ServicePointManager 时,您必须在实例化任何队列之前执行此操作。
  • 我也遇到了性能问题,你有 4 m/s 的改进给你带来了什么?
【解决方案2】:

此外,ServicePointManager.DefaultConnectionLimit 应在创建服务点之前增加。实际上 Sandrino 的回答说的是同样的事情,但使用的是配置。

即使在云端也可以关闭代理检测。在代理配置元素中自动检测。减慢初始化速度。

选择分布式分区键。

将您的帐户配置在计算和客户附近。

根据需要设计添加更多帐户。

截至 2012 年 7 月,Microsoft 将队列和表的 SLA 设置为 2,000 tps。

抱歉,我没有阅读 Sandrino 的链接答案,只是在观看 Build 2012 会议时正在讨论这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2021-01-26
    • 2012-02-04
    • 1970-01-01
    • 2021-10-21
    • 2013-11-12
    • 2023-01-19
    相关资源
    最近更新 更多