【发布时间】:2018-09-26 10:54:57
【问题描述】:
我们使用 8 核、32GB RAM 的 mongodb 3.4.14。我正在使用 Jmeter 执行负载测试,有 70 个线程我有可接受的输出。但随着负载的增加,SLA 呈指数级增长,吞吐量急剧下降。我尝试增加ulimit,下一步是分片,除此之外我还能做其他性能优化吗?
更新
@Jeet,以下是调查结果:
- 是否有很多聚合查询?你有什么样的集合结构,即
负载测试在单个聚合查询上运行,并且文档的结构也具有相同的字段集。修复文档大小会有所帮助吗?我该怎么做?
- 有很多嵌套数组吗?
答案:没有嵌套查询。
- 是单个实例还是副本集?尝试将具有读写功能的副本集放入不同的节点。
目前我们只想在单个节点上运行。
- 查询是否返回来自多个集合的数据?
不,只有 1 个集合。
- 检查您的实例在多少百分比的操作中出现页面错误?
在有 500 个用户的情况下,我看不到太多页面错误,只有 2 位数字。
- 在高锁定/队列期间检查您的日志以查找具有高 nscanned 或 scanAndOrder 的操作,并相应地编制索引。
如何查看?
- 检查您对 CPU 密集型运算符(如 $all、$push/$pop/$addToSet)的查询,以及对大型文档的更新,尤其是对具有大型数组(或大型子文档数组)的文档的更新。
是的,在上述负载下,CPU 已满且响应延迟。我们正在做一个 groupBy 然后按限制排序。
- 如果您的数据库写入繁重,请记住每个数据库一次只能写入一个 CPU(由于该线程持有写入锁)。考虑将部分数据移到自己的数据库中。
我们的数据库主要是读取量大,集合将每天填充一次。
除此之外,我还尝试通过将以下代码放入 for 循环中来做一个简单的测试:
Document findQuery = new Document("userId", "Sham");
FindIterable<Document> find = collection.find(findQuery);
MongoCursor<Document> iterator = find.iterator();
使用executor启动进程:
ExecutorService executorService = Executors.newFixedThreadPool(100);
即使这样,性能也很慢,需要 900 毫秒才能返回。
1 个请求 = 每个请求 150 毫秒
100 个请求 = 每个请求 900 毫秒
当我看到 500 个用户的统计数据如下:
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 317M 28.0M 0|0 0|0 156b 45.1k 3 Oct 12 15:31:19.644
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 317M 28.0M 0|0 0|0 156b 45.1k 3 Oct 12 15:31:20.650
*0 *0 *0 *0 0 3|0 0.0% 0.0% 0 317M 28.0M 0|0 0|0 218b 46.1k 3 Oct 12 15:31:21.638
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 317M 28.0M 0|0 0|0 158b 45.4k 3 Oct 12 15:31:22.638
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 317M 28.0M 0|0 0|0 157b 45.4k 3 Oct 12 15:31:23.638
*0 376 *0 *0 0 112|0 0.0% 0.0% 0 340M 30.0M 0|0 0|0 64.9k 23.6m 26 Oct 12 15:31:24.724
*0 98 *0 *0 0 531|0 0.0% 0.0% 0 317M 27.0M 0|0 0|0 109k 6.38m 3 Oct 12 15:31:25.646
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 317M 27.0M 0|0 0|0 215b 45.6k 3 Oct 12 15:31:26.646
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 317M 27.0M 0|0 0|0 157b 45.1k 3 Oct 12 15:31:27.651
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 317M 27.0M 0|0 0|0 159b 45.8k 3 Oct 12 15:31:28.642
【问题讨论】:
标签: java mongodb performance