2011-04-27 38 views
3

我正在做一個非常簡單的測試,其隊列指向真正的Azure存儲,並且我不知道爲什麼執行測試我的電腦比將工作人員角色部署到Azure並在那裏執行更快。我在本地測試時沒有使用Dev Storage,我的.cscfg具有連接字符串到實際存儲。Azure存儲隊列從雲中的工作角色非常緩慢,但不是來自我的機器

存儲帳戶和角色位於相同的關聯組中。

該測試是一個Web角色和一個工作者角色。該頁面告訴工作人員做什麼測試,工作人員這樣做並返回所消耗的時間。這個特定的測試可以使用多達32條消息從Azure隊列獲取1000條消息。首先,在將應用程序部署到Azure並從此運行之後,我測試了使用VS運行調試。

的結果是:

  • 從我的電腦:34805.6495毫秒。
  • 來自Azure角色:7956828.2851毫秒。

這可能意味着訪問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; 
    } 

我不什麼我做錯了,同樣的代碼,相同的連接字符串,我得到了這些resuts。

有什麼想法?

更新:

該問題似乎是在我計算它的方式。

我已經更換了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); 

這一個:

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

而現在的結果是相似的,所以顯然存在怎樣精度的差異被處理或什麼。我將在稍後進行研究。

+0

這看起來反直覺,但我看不出任何明顯的代碼,會導致這個問題。儘管我有一點困惑於itemCount參數。這是放入隊列的項目數量嗎?如果是這樣,那麼你只需要通過for循環的itemCount/32次,並且傳遞給ItemTest的itemCount應該是32,而不是1000. – knightpfhor 2011-04-27 20:54:57

+0

這段代碼是多用途測試類層次結構的一部分。該類被認爲是衡量「每個項目」的時間,所以itemCount用於包含總項目,itemCurrent是集合中的當前項目。對於這個測試,我把這1000個項目放在「pre」調用中,並測量讀取所有消息需要多長時間,讀取消息時,「done」設置爲true,並且當I計算平均值。無論如何,我現在要做一個更直接的測試。 – vtortola 2011-04-28 08:44:47

回答

2

該問題顯然是StopWatch和TimeSpan滴答的不同性質的問題,如討論here所述。

Stopwatch.ElapsedTicks Property

秒錶蜱從DateTime.Ticks不同。DateTime.Ticks值中的每個記號表示一個100納秒的間隔。 ElapsedTicks值中的每個刻度表示等於1秒的時間間隔除以頻率。

1

您的CPU利用率如何?這可能是因爲你的代碼正在衝擊CPU並且你的工作站比Azure節點快得多?

+0

大多數情況下CPU處於閒置狀態,我對信息內容沒有做任何處理,只是閱讀它。 – vtortola 2011-04-28 08:45:24

+0

問題是在計算中,看到更新,但我不知道爲什麼發生。 – vtortola 2011-04-29 11:40:50