为了账号安全,请及时绑定邮箱和手机立即绑定

MongoDB 在负载下运行缓慢

MongoDB 在负载下运行缓慢

叮当猫咪 2021-10-13 10:27:31
我们使用 mongodb 3.4.14,8 核,32GB RAM。我正在使用 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 毫秒
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

这也取决于您发起的查询类型,请检查是否存在以下提到的要点 -

  • 有很多聚合查询吗?你有什么样的收藏结构,即

  • 有很多嵌套数组吗?

  • 是单实例还是副本集?尝试将具有读取和写入功能的副本集放置到不同的节点。

  • 查询是否从多个集合返回数据?

  • 检查您的实例在多少% 的操作中出现页面错误?

  • 在高锁定/队列期间检查您的日志是否有高 nscanned 或 scanAndOrder 操作,并相应地索引。

  • 检查您对 CPU 密集型运算符(如 $all、$push/$pop/$addToSet)的查询,以及对大型文档的更新,尤其是对具有大型数组(或大型子文档数组)的文档的更新。

  • 如果您的数据库是写密集型的,请记住,每个数据库一次只能写入一个 CPU(由于该线程持有写锁)。考虑将该数据的一部分移动到其自己的数据库中。

随着时间的推移,这很少会降低性能。我已经在这里介绍了最常见的用例,但是请查看这篇文章以获取更多见解。


查看完整回答
反对 回复 2021-10-13
?
喵喔喔

TA贡献1735条经验 获得超5个赞

请检查您的硬件是否受到限制,磁盘是系统中最大的瓶颈。要查看硬件是否不受限制:


top/htop => cpu percentage

iostat -x 1 => sysstat tool to see disk r/w limits (%util)


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信