Performance Azure存储队列从云中的工作者角色开始非常慢,但从我的计算机开始就不是了

Performance Azure存储队列从云中的工作者角色开始非常慢,但从我的计算机开始就不是了,performance,azure,azure-storage,azure-queues,Performance,Azure,Azure Storage,Azure Queues,我正在做一个非常简单的测试,队列指向真正的Azure存储,我不知道为什么,从我的计算机执行测试比将工作者角色部署到Azure并在那里执行要快得多。当我在本地测试时,我没有使用Dev存储,我的.cscfg具有到实际存储的连接字符串 存储帐户和角色位于同一关联组中 测试是一个web角色和一个worker角色。该页面告诉工作人员要执行什么测试,工作人员执行测试并返回所消耗的时间。此特定测试测量使用32条消息的批处理从Azure队列获取1000条消息所需的时间。首先,在我将应用部署到Azure并从那里运

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

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

测试是一个web角色和一个worker角色。该页面告诉工作人员要执行什么测试,工作人员执行测试并返回所消耗的时间。此特定测试测量使用32条消息的批处理从Azure队列获取1000条消息所需的时间。首先,在我将应用部署到Azure并从那里运行它之后,我使用VS测试运行debug

结果是:

  • 从我的电脑:34805.6495毫秒
  • 来自Azure角色:7956828.2851毫秒
这可能意味着从Azure外部访问队列比从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;
    }
我不知道我做错了什么,相同的代码,相同的连接字符串,我得到了这些结果

有什么想法吗

更新:

问题似乎出在我的计算方法上

我已经替换了
times.Add(sw.ElapsedTicks)用于<代码>次数。添加(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);
对于这一个:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements", 
times.Min(),times.Max(),times.Average());

现在的结果是相似的,所以很明显,在处理精度方面存在差异。稍后我将对此进行研究。

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

正如所讨论的,问题显然是秒表和时间间隔的不同性质的问题

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


这似乎与直觉相反,但我在代码中看不到任何明显的问题。不过,我对itemCount参数有点困惑。这是放入队列的项目数吗?如果是这样,那么您只需要遍历for循环itemCount/32次,传递到ItemTest的itemCount应该是32,而不是1000。该类被认为是度量“每项”时间的,因此itemCount使用total items,itemCurrent使用集合中的当前项。在这个测试中,我将1000项放在“pre”调用中,并测量读取所有消息所需的时间,当消息被读取时,“done”设置为true,并且在计算平均值时不再考虑调用。无论如何,我现在要做一个更直接的测试。CPU大部分时间是空闲的,我没有对消息的内容做任何事情,只是阅读它。问题在于计算,请参阅更新,但我不知道为什么会发生这种情况。
return new TestResult(id, test + " with " + itemCount.ToString() + " elements", 
times.Min(),times.Max(),times.Average());