Azure DocumentDB性能问题

Azure DocumentDB性能问题,azure,azure-cosmosdb,Azure,Azure Cosmosdb,从本地计算机上的C#代码运行DocumentDB查询时,一个简单的DocumentDB查询平均需要0.5秒。另一个例子是,获取对文档集合的引用平均需要0.7秒。这是意料之中的事吗?下面是我用来检查集合是否存在的代码,这很简单,但是有什么方法可以改善糟糕的性能吗 // Create a new instance of the DocumentClient var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);

从本地计算机上的C#代码运行DocumentDB查询时,一个简单的DocumentDB查询平均需要0.5秒。另一个例子是,获取对文档集合的引用平均需要0.7秒。这是意料之中的事吗?下面是我用来检查集合是否存在的代码,这很简单,但是有什么方法可以改善糟糕的性能吗

// Create a new instance of the DocumentClient
var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);

// Get the database with the id=FamilyRegistry
var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").AsEnumerable().FirstOrDefault();

var stopWatch = new Stopwatch();
stopWatch.Start();

// Get the document collection with the id=FamilyCollection
var documentCollection = client.CreateDocumentCollectionQuery("dbs/" 
    + database.Id).Where(c => c.Id == "FamilyCollection").AsEnumerable().FirstOrDefault();

stopWatch.Stop();

// Get the elapsed time as a TimeSpan value.
var ts = stopWatch.Elapsed;

// Format and display the TimeSpan value.
var elapsedTime = String.Format("{0:00} seconds, {1:00} milliseconds",
    ts.Seconds,
    ts.Milliseconds );

Console.WriteLine("Time taken to get a document collection: " + elapsedTime);
Console.ReadKey();
本地计算机上的平均输出:

Time taken to get a document collection: 0 seconds, 752 milliseconds

在我的另一段代码中,我正在做20个小文档更新,每个JSON大小约为400字节,总共需要12秒。我只在我的开发环境中运行,但我期望有更好的性能。

简而言之,使用DocumentDB可以在~9毫秒内完成端到端的操作。我将在下面介绍所需的更改,以及它们为什么/如何影响结果

在DocumentDB中,第一个查询总是花费更长的时间,因为它会执行一些设置工作(获取DocumentDB分区的物理地址)。接下来的两个请求需要更长的时间来预热连接池。随后的查询将与您的网络一样快(由于SSD存储,DocumentDB中的读取延迟非常低)

例如,如果您修改上面的代码以进行测量,例如10个读数,而不仅仅是第一个读数,如下图所示:

using (DocumentClient client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey))
{
    long totalRequests = 10;

    var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").AsEnumerable().FirstOrDefault();

    Stopwatch watch = new Stopwatch();
    for (int i = 0; i < totalRequests; i++)
    {
        watch.Start();
        var documentCollection = client.CreateDocumentCollectionQuery("dbs/"+ database.Id)
            .Where(c => c.Id == "FamilyCollection").AsEnumerable().FirstOrDefault();

        Console.WriteLine("Finished read {0} in {1}ms ", i, watch.ElapsedMilliseconds);
        watch.Reset();
    }
}

Console.ReadKey();
接下来,我从默认的网关切换到Direct/TCP连接,以将延迟从两个跃点提高到一个,即将初始化代码更改为:

using (DocumentClient client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey, new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp }))
现在,按ID查找集合的操作在23毫秒内完成:

Finished read 0 in 197ms
Finished read 1 in 117ms
Finished read 2 in 23ms
Finished read 3 in 23ms
Finished read 4 in 25ms
Finished read 5 in 23ms
Finished read 6 in 31ms
Finished read 7 in 23ms
Finished read 8 in 23ms
Finished read 9 in 23ms
当您从同样在同一Azure DC中运行的Azure VM或工作者角色运行相同的结果时,情况如何?同样的操作在大约9毫秒内完成

Finished read 0 in 140ms
Finished read 1 in 10ms
Finished read 2 in 8ms
Finished read 3 in 9ms
Finished read 4 in 9ms
Finished read 5 in 9ms
Finished read 6 in 9ms
Finished read 7 in 9ms
Finished read 8 in 10ms
Finished read 9 in 8ms
Finished read 9 in 9ms
因此,总结一下:

  • 对于性能度量,请考虑一些度量示例,以说明DocumentDB客户端的启动/初始化
  • 请使用TCP/直接连接以实现最低延迟
  • 如果可能,请在同一Azure区域内运行
  • 如果您遵循这些步骤,就可以获得优异的性能,并且可以使用DocumentDB获得最佳性能

您是否尝试过在与DocumentDB相同的数据中心运行此功能?在使用DocumentDB操作跨越数据中心边界时,我遇到了很大的延迟(~250ms)。但是,如果我从运行在同一Azure数据中心的实例调用它,我会得到较低的延迟(~10ms)。@LarryMaccherone不,我没有,我只从本地开发环境运行了我的代码。我得到的时间是您得到的时间的10倍,但我再次从欧洲调用DocumentDB服务。不过,在出于某种原因调用Azure表存储时,我并没有得到如此糟糕的性能。我在这里添加了一个粘贴库@Aravind,在我的工作中运行时,即使在初始化和预热之后,我也无法获得接近您的性能(约250ms vs约23ms)。我不会把它从北卡罗来纳州搬到美国东部的数据中心。对我来说,另一个不同之处是,我使用的是node.js,我知道它不使用TCP/Direct,但我还想知道你提到的“两跳”。这是否适用于node.js的使用?第二跳的目的是什么?科尔斯?作为一名Microsoft员工,您的实验是否有可能与您的数据中心建立快速网络连接?再说一次,这可能是我糟糕的工作connection@IngeHenriksen,你能给我发一份执行情况的WireShark跟踪吗?您的DocumentDB帐户位于哪个地区?您的客户在哪里?DocumentDB在Azure的西欧和北欧地区都可用。相比之下,Azure Tables帐户在哪里?@LarryMaccherone,相比之下,从我的家庭互联网连接,我得到的是33毫秒,而不是23毫秒,所以差别不大。如果你能给我发送一个WireShark跟踪,我们可以用它进行调试。@Aravinchandran我没有WireShark,但如果有帮助的话,我会打电话给北欧的美国中央DocumentDB服务。我正在使用DocumentDB客户端的v1.5。
Finished read 0 in 140ms
Finished read 1 in 10ms
Finished read 2 in 8ms
Finished read 3 in 9ms
Finished read 4 in 9ms
Finished read 5 in 9ms
Finished read 6 in 9ms
Finished read 7 in 9ms
Finished read 8 in 10ms
Finished read 9 in 8ms
Finished read 9 in 9ms