为什么对 Azure Document DB 的第一个请求比后续请求慢得多?

Why is the first request to Azure Document DB much slower than subsequent requests?

我已阅读文档数据库 performance guidance,但我仍然发现对文档数据库的首次请求要慢得多。我们正在使用 client.OpenAsync() 提示并在 TCP 上以 Direct 模式连接。

我写了一个示例程序来 repo 这个问题(这个 gist 有包括记录时间在内的完整源代码):

var endpoint = "";
var key = "";

var connectionPolicy = new ConnectionPolicy 
{
    ConnectionMode = ConnectionMode.Direct,
    ConnectionProtocol = Protocol.Tcp
};

var client = new DocumentClient(new Uri(endpoint), key, connectionPolicy);
var collection = UriFactory.CreateDocumentCollectionUri("test", "TestCollection");

await client.OpenAsync();

for (int i = 0; i < 5; i++)
{
    var test = new Test { Foo = $"Test doc {i}" };
    await client.CreateDocumentAsync(collection, test);     
}

HTTPS 上使用 Gateway 模式我看到了这些时间:

并且在 Direct 模式下 TCP 这些:

如您所见,Direct 模式比 TCP 后续请求快得多,但第一个请求仍然慢得多。

这有什么原因吗?我们可以做些什么来减少初始响应时间?

更新

我忘记了我们代理了 Azure VM 的所有 HTTPS 流量,这就是为什么 HTTPS 响应比 TCP 在我的初始测试中慢得多。

代理关闭,运行 10 次迭代(3 次用于预热文档数据库和 SDK,7 次用于配置文件),我现在看到 Gateway 的响应时间约为 11 毫秒HTTPSDirect 超过 TCP 约 7 毫秒。

就像提到的其中一张海报一样,这已在

中介绍

在 DocumentDB 中,第一个操作需要花费几秒钟的时间,因为 SDK 会执行额外的设置工作,例如获取 DocumentDB 数据分区的物理地址。后续操作将以个位数毫秒的顺序完成(如您的屏幕截图所示,写入大约需要 7 毫秒,读取通常不到 2 毫秒)。

DocumentDB 在 p99 级别提供低延迟和高吞吐量。要做到这一点,建立连接和池化连接、下载元数据以进行有效的路由缓存和许多其他大规模优化都需要摊销成本。这就是为什么要预付一些费用的原因。