2017-01-20 40 views
2

我可能(可能)做这一切都是错误的,结果大不相同。但是我在使用DocumentDb的Web应用程序中产生了一些奇怪的结果之后,我做了一个简单的基准测试。当“基准”documentdb

 var id = "62734c17-e939-43bd-8719-08e4c7b51f75"; 
     var client = new DocumentClient(new Uri(LocalDbConfig.Endpoint),LocalDbConfig.Key); 
     var sw = new Stopwatch(); 
     var collectionLink = UriFactory.CreateDocumentCollectionUri(LocalDbConfig.DatabaseId, 
      LocalDbConfig.CollectionId); 

     var tsResults = new List<long>(); 
     var docResults = new List<long>(); 

     for (int i = 0; i < 10; i++) 
     { 
      sw.Restart(); 
      var result = client.CreateDocumentQuery(collectionLink, $"select c._ts from c where c.id = \"{id}\"").AsEnumerable().FirstOrDefault()._ts; 
      sw.Stop(); 
      tsResults.Add(sw.ElapsedMilliseconds); 
      Console.WriteLine($"TS: {sw.ElapsedMilliseconds}"); 
     } 

     for (int i = 0; i < 10; i++) 
     { 
      sw.Restart(); 
      var doc = client.CreateDocumentQuery(collectionLink).Where(q => q.Id == id).AsEnumerable().FirstOrDefault(); 
      sw.Stop(); 
      docResults.Add(sw.ElapsedMilliseconds); 
      Console.WriteLine($"DOC: {sw.ElapsedMilliseconds}"); 
     } 

     Console.WriteLine($"TS: Average: {tsResults.Average()} - Longest: {tsResults.Max()} - Shortest: {tsResults.Min()}"); 
     Console.WriteLine($"DOC: Average: {docResults.Average()} - Longest: {docResults.Max()} - Shortest: {docResults.Min()}"); 


     Console.ReadLine(); 

这是一个C#控制台应用程序的Main()功能。我要求的文档大约是5MB的JSON。

在第一个循环中,我只是请求文档的单个属性,它是时间戳。 (我开始尝试实现一个非常天真的缓存startegy)而另一个循环返回完整的文档。

这是输出:

TS: 1450 
TS: 17 
TS: 18 
TS: 22 
TS: 548 
TS: 156 
TS: 532 
TS: 174 
TS: 519 
TS: 182 
DOC: 557 
DOC: 1725 
DOC: 1916 
DOC: 1868 
DOC: 1876 
DOC: 1832 
DOC: 1861 
DOC: 1851 
DOC: 1881 
DOC: 1870 
TS: Average: 361,8 - Longest: 1450 - Shortest: 17 
DOC: Average: 1723,7 - Longest: 1916 - Shortest: 557 

正如你可以看到,返回的时间戳是所有的地方,但返回完整的文档是那种稳定的第一请求后,为什么第一个请求400%比其他我无法弄清楚的要快。

需要注意的是该测试运行在DocumentDb模拟器上,但原始问题也出现在Azure DocumentDb服务中。

任何人都知道为什么让时间戳到处都是这样吗?为什么第一次读取的文件是500毫秒,而其余的几乎是2000毫秒?

+0

您可以在与您的DocumentDB相同的数据中心运行此模块,而不是在模拟器本地运行该模块吗?我知道你说这个问题是存在的,但我认为如果你的数据来自于生产环境,更多的人会对帮助感兴趣。 –

+0

我也建议关闭节流的重试。初始化DocumentClient时,将ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottle = 0设置为消除任何节流变化。 –

+0

此外,如果您可以将收集内容共享到[email protected],我们可以调试/分析并将结果发布回SO。 –

回答

0

根据提供的信息,您可能已达到预配置的采集吞吐量并进入速率限制。当速率限制时,SDK会自动重试,因此您会将此视为较长的延迟,特别是对于像SELECT c._ts这样的有效载荷较小的请求。

通过增加集合的预配置吞吐量,可以获得可预测的单位数毫秒延迟。在[email protected]上通过电子邮件发送Azure DocumentDB支持以及您的端点详细信息也将为您提供确凿的答案。