Azure Storage Queue从云中的辅助角色来看非常慢,但不是来自我的计算机

时间:2011-04-27 14:43:52

标签: performance azure azure-storage azure-queues

我正在进行一项非常简单的测试,队列指向真正的Azure存储,我不知道为什么,从我的计算机执行测试比将工作角色部署到azure并在那里执行要快得多。我在本地测试时没有使用Dev Storage,我的.cscfg具有到真实存储的连接字符串。

存储帐户和角色位于同一个关联组中。

测试是一个Web角色和一个辅助角色。该页面告诉工作人员要做什么测试,工作人员这样做并返回消耗的时间。此特定测试用于确定使用32个消息批次从Azure队列获取1000条消息所需的时间。首先,在将应用程序部署到Azure并从那里运行之后,我测试了使用VS运行调试。

结果是:

  • 从我的电脑:34805.6495 ms。
  • 来自Azure角色:7956828.2851 ms。

这可能意味着从Azure外部访问队列比在内部访问队列更快,这没有任何意义。

我正在测试这样:

    private TestResult InQueueScopeDo(String test, Guid id, Int64 itemCount)
    {
        CloudStorageAccount account = CloudStorageAccount.Parse(_connectionString);
        CloudQueueClient client = account.CreateCloudQueueClient();
        CloudQueue queue = client.GetQueueReference(Guid.NewGuid().ToString());

        try
        {
            queue.Create();
            PreTestExecute(itemCount, queue);

            List<Int64> times = new List<Int64>();
            Stopwatch sw = new Stopwatch();
            for (Int64 i = 0; i < itemCount; i++)
            {
                sw.Start();
                Boolean valid = ItemTest(i, itemCount, queue);
                sw.Stop();
                if (valid)
                    times.Add(sw.ElapsedTicks);
                sw.Reset();
            }

            return new TestResult(id, test + " with " + itemCount.ToString() + " elements", TimeSpan.FromTicks(times.Min()).TotalMilliseconds,
                                                 TimeSpan.FromTicks(times.Max()).TotalMilliseconds,
                                                 TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);
        }
        finally
        {
            queue.Delete();
        }

        return null;
    }

PreTestExecute将1000个项目放在队列中,每个项目为2048个字节。

这就是此测试的ItemTest方法中发生的情况:

    Boolean done = false;
    public override bool ItemTest(long itemCurrent, long itemCount, CloudQueue queue)
    {
        if (done)
            return false;

        CloudQueueMessage[] messages = null;

        while ((messages = queue.GetMessages((Int32)itemCount).ToArray()).Any())
        {
            foreach (var m in messages)
                queue.DeleteMessage(m);
        }

        done = true;

        return true;
    }

我不是我做错了,相同的代码,相同的连接字符串,我得到了这些结果。

有什么想法吗?

更新:

问题似乎与我计算的方式有关。

我已将[{1}}替换为times.Add(sw.ElapsedTicks);和此块:

times.Add(sw.ElapsedMilliseconds);

这个:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements",
TimeSpan.FromTicks(times.Min()).TotalMilliseconds,                             
TimeSpan.FromTicks(times.Max()).TotalMilliseconds,     
TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);

现在结果是相似的,所以显然处理精度的方式有所不同。我稍后会研究这个。

2 个答案:

答案 0 :(得分:2)

问题显然是StopWatch和TimeSpan滴答的不同性质的问题,如here所述。

Stopwatch.ElapsedTicks Property

  

秒表刻度与DateTime.Ticks不同。 DateTime.Ticks值中的每个刻度表示一个100纳秒的间隔。 ElapsedTicks值中的每个刻度表示等于1秒的时间间隔除以频率。

答案 1 :(得分:1)

您的CPU利用率如何?这可能是您的代码加密CPU并且您的工作站比Azure节点快得多吗?