Azure Cosmos DB 模拟器慢(100 毫秒/请求)
Azure Cosmos DB Emulator slow (100 ms / request)
我正在尝试设置 Azure Cosmos DB Emulator 以在本地使用集成测试,但我发现它非常慢。
我正在使用 container.ReadItemAsync<T>
方法阅读一个 ~1KB JSON 文档,并等待答案。我在循环中调用此方法 100 次。
执行时间始终在 9.5-10 秒左右,因此 一个请求大约需要 100 毫秒,与此服务 运行 相比非常慢本地。
为什么这么慢,我怎样才能让它更快?
考虑到所有磁盘 I/O.
,我预计最多 1 毫秒/请求
我尝试了以下但它们没有用:
- 转动速率限制on/off
- 使用各种配置设置创建 database/collection,它对性能的影响为零(即使是 100k RU)
- 手动创建数据库和集合与使用客户端 SDK
- 模拟器托盘菜单中的“重置数据”菜单
更多信息:
- 模拟器版本为
2.14.6.0 (68d4ca59)
- 我从开始菜单启动模拟器,但从命令行启动它并没有改变任何东西
- 我正在使用
Microsoft.Azure.Cosmos
nuget 包,版本 3.22.1
- 我的CPU是i7-8565U,但是在测试的时候还没用完运行
- 我的系统有 16 GB RAM
- 我的系统 运行 在足够快的 SSD 上:“NVMe SK hynix BC501 H”,但是 运行 测试时 SSD 使用率在 0 到 2% 之间。
- 如果我将文档大小增加到 100 KB 甚至 1 MB,性能是一样的。
使用 AllowBulkExecution = true
设置创建 CosmosClientOptions
可能会导致此问题。
the SDK will construct batches and group operations, when the batch is full, it will get dispatched, but if the batch doesn’t fill up, there is a timer that will dispatch it to make sure they complete. This timer currently is 100 milliseconds. So if the batch does not get filled up (for example, you are just sending 50 concurrent operations), then the overall latency might be affected.
我正在尝试设置 Azure Cosmos DB Emulator 以在本地使用集成测试,但我发现它非常慢。
我正在使用 container.ReadItemAsync<T>
方法阅读一个 ~1KB JSON 文档,并等待答案。我在循环中调用此方法 100 次。
执行时间始终在 9.5-10 秒左右,因此 一个请求大约需要 100 毫秒,与此服务 运行 相比非常慢本地。
为什么这么慢,我怎样才能让它更快?
考虑到所有磁盘 I/O.
我尝试了以下但它们没有用:
- 转动速率限制on/off
- 使用各种配置设置创建 database/collection,它对性能的影响为零(即使是 100k RU)
- 手动创建数据库和集合与使用客户端 SDK
- 模拟器托盘菜单中的“重置数据”菜单
更多信息:
- 模拟器版本为
2.14.6.0 (68d4ca59)
- 我从开始菜单启动模拟器,但从命令行启动它并没有改变任何东西
- 我正在使用
Microsoft.Azure.Cosmos
nuget 包,版本3.22.1
- 我的CPU是i7-8565U,但是在测试的时候还没用完运行
- 我的系统有 16 GB RAM
- 我的系统 运行 在足够快的 SSD 上:“NVMe SK hynix BC501 H”,但是 运行 测试时 SSD 使用率在 0 到 2% 之间。
- 如果我将文档大小增加到 100 KB 甚至 1 MB,性能是一样的。
使用 AllowBulkExecution = true
设置创建 CosmosClientOptions
可能会导致此问题。
the SDK will construct batches and group operations, when the batch is full, it will get dispatched, but if the batch doesn’t fill up, there is a timer that will dispatch it to make sure they complete. This timer currently is 100 milliseconds. So if the batch does not get filled up (for example, you are just sending 50 concurrent operations), then the overall latency might be affected.