【发布时间】:2019-11-15 01:09:22
【问题描述】:
我知道 mongo db 会锁定读写操作。
我的用例:
仅读取操作。没有写操作。
我收集了大约 1000 万份文档。存储引擎是wiredTiger。
Mongo 版本是 3.4。
我提出了一个应该返回 30k 文档的请求 - 平均需要 650 毫秒。
当我发出并发请求时 - 相同的请求 - 100 次 - 需要几秒钟 - 几秒到 2 分钟处理所有请求。
我只有一个节点来提供数据。
我如何访问数据:
每个文档包含 25 到 40 个字段。我索引了几个字段。我基于一个索引字段进行查询。
API 会以 json 形式返回所有匹配的文档。
其他信息:API 是使用 Spring boot 编写的。
从远程机器上的命令行通过 JMeter shell 脚本测试并发性。
所以,
我的问题:
- 我是否缺少任何优化? [存储引擎级别,版本]
- 我不能在不到一秒的时间内完成所有读取请求吗?
- 如果是这样,我可以为这个用例保留什么 SLA?
有什么建议吗?
编辑:
我在 mongodb 中启用了级别 2 的数据库分析器。
我的单个查询在内部转换为 4 个查询:
- 初始读取
- 获取更多
- 获取更多
- 获取更多
这些是通过分析器找到的查询。
总共不到 100 毫秒。真的吗?
我的并发查询:
现在,当我达到 100 个请求时,将近 150 个操作超过 100ms,100 个操作超过 200ms,90 个操作超过 300ms。
根据我的单个查询分析,100 个请求将在内部转换为 400 个查询。这是我通过检查分析器输出中的查询标记来验证的固定模式。
我希望这会影响我的请求性能。
【问题讨论】:
-
当您发出 100 个并发请求时,您如何划分要返回的结果范围?该时间是否包括建立初始连接所需的时间?
-
不,我正在使用代码中的记录器计算查询时间 - 以及 Jmeter 计时。两者都更多。
-
你确定是mongodb而不是API?什么慢日志显示?默认情况下,它应该记录所有耗时超过 100 毫秒的查询。您确认那里记录了查询时间是“几秒到两分钟”吗?
-
启用数据库探查器并检查数据库的 system.profile 集合中所有长时间运行的操作的记录。它应该告诉您性能下降是在服务器端还是客户端上
标签: mongodb