天蓝色队列性能

时间:2012-10-16 13:18:32

标签: c# performance azure

对于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在应用程序启动时被初始化,因此您不必担心时间依赖性。

2 个答案:

答案 0 :(得分:10)

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

对于在表存储中添加1000个项目,花了3分钟,并且根据我在答案中描述的更改,它降至4秒(250个请求/秒)。最后,表存储和存储队列并没有那么不同。后端是相同的,数据只是以不同的方式存储。表存储和队列都通过REST API公开,因此如果您改进处理请求的方式,您将获得更好的性能。

最重要的变化:

  • expect100Continue:false
  • useNagleAlgorithm:false(你已经这样做了)
  • 并行请求与connectionManagement/maxconnection
  • 结合使用

答案 1 :(得分:1)

此外,在创建服务点之前,应增加ServicePointManager.DefaultConnectionLimit。实际上,桑德里诺的回答是相同的,但使用配置。

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

选择分布式分区键。

将您的帐户与计算和客户并列。

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

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

我没有读过Sandrino的链接答案,对不起,就在这个问题上我正在观看Build 2012会议。