当"基准测试"时,会产生截然不同的结果。 documentdb

时间:2017-01-20 11:59:44

标签: c# benchmarking azure-cosmosdb

我可能(可能)做错了。但是我在使用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。

在第一个循环中,我只是请求文档的单个属性,它是时间戳。 (我开始尝试实现av非常天真的缓存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毫秒?

1 个答案:

答案 0 :(得分:0)

根据提供的信息,您可能已达到集合的预配置吞吐量并进入速率限制。 SDK会在速率限制时自动重试,因此您会将此视为更长的延迟,尤其是对于SELECT c._ts等小型有效负载的请求。

通过增加集合的预配置吞吐量,您可以获得可预测的单位数毫秒延迟。通过askdoc@microsoft.com通过电子邮件发送Azure DocumentDB支持以及您的终端详细信息也可以获得确定的答案。