我已阅读文档 DB performance guidance ,但我仍然看到对文档数据库的首次请求要慢得多。我们使用 client.OpenAsync()
技巧并通过 TCP
以 Direct
模式进行连接。
我编写了一个示例程序来重现此问题(此 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
使用网关
模式我看到这些时间:
在 Direct
模式下,通过 TCP
这些:
如您所见,通过 TCP
的 Direct
模式对于后续请求来说要快得多,但第一个请求仍然慢得多。
这有什么原因吗?我们可以采取什么措施来缩短初始响应时间?
更新
我忘记了我们代理了 Azure VM 之外的所有 HTTPS 流量,这就是为什么在我的初始测试中 HTTPS
响应比 TCP
慢得多的原因。
关闭代理并运行 10 次迭代(3 次用于预热文档数据库和 SDK,7 次用于分析),我现在看到 Gateway
的响应时间约为 11 毫秒(Gateway
超过 ) HTTPS
和通过 TCP
的 Direct
约为 7 毫秒。
最佳答案
就像提到的其中一张海报一样,这已在 DocumentDB performance issues 中进行了介绍。
DocumentDB 中的第一个操作需要更长的时间,因为 SDK 会执行额外的设置工作,例如获取 DocumentDB 数据分区的物理地址。后续操作将以个位数毫秒的速度完成(对于屏幕截图中的写入大约需要 7 毫秒,读取通常低于 2 毫秒)。
关于c# - 为什么对 Azure Document DB 的第一个请求比后续请求慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39272563/