Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB在负载下运行缓慢_Java_Mongodb_Performance - Fatal编程技术网

Java MongoDB在负载下运行缓慢

Java MongoDB在负载下运行缓慢,java,mongodb,performance,Java,Mongodb,Performance,我们使用mongodb 3.4.14和8核32GB RAM。我用Jmeter执行负载测试,有70个线程的输出是可以接受的。但随着负载的增加,SLA呈指数级增长,吞吐量急剧降低。我尝试增加ulimit,下一步就是切分,除此之外,还有其他性能优化吗 使现代化 @吉特,以下是调查结果: 有很多聚合查询吗?你们有什么样的收集结构,即 负载测试在单个聚合查询上运行,文档的结构也具有相同的字段集。修正文档大小会有帮助吗?我怎么做 有很多嵌套数组吗 答:没有嵌套查询 它是单个实例还是副本集?尝试将具有读写功能

我们使用mongodb 3.4.14和8核32GB RAM。我用Jmeter执行负载测试,有70个线程的输出是可以接受的。但随着负载的增加,SLA呈指数级增长,吞吐量急剧降低。我尝试增加
ulimit
,下一步就是切分,除此之外,还有其他性能优化吗

使现代化 @吉特,以下是调查结果:

  • 有很多聚合查询吗?你们有什么样的收集结构,即
  • 负载测试在单个聚合查询上运行,文档的结构也具有相同的字段集。修正文档大小会有帮助吗?我怎么做

  • 有很多嵌套数组吗 答:没有嵌套查询

  • 它是单个实例还是副本集?尝试将具有读写功能的副本集放置到不同的节点 目前,我们只希望在单个节点上运行

  • 查询是否从多个集合返回数据
  • 没有,只有一套

  • 检查您的实例有多少操作是页面错误
  • 在500个用户的负载下,我看不到太多页面错误,只有两位数

  • 在高锁定/队列期间,检查日志中是否有高nscanned或SCANNDER的操作,并相应地编制索引
  • 我怎么检查

  • 检查对CPU密集型运算符的查询,如$all、$push/$pop/$addToSet,以及对大型文档的更新,尤其是对具有大型数组(或大型子文档数组)的文档的更新 是的,在上述负载下,CPU已满,响应延迟。我们正在进行分组,然后按限制进行排序

  • 如果您的数据库写得很重,请记住,每个数据库一次只能有一个CPU进行写操作(因为该线程持有写锁)。考虑将数据的一部分移到它自己的数据库中。
  • 我们的数据库大部分都读得很重,收集将每天填充一次

    除此之外,我还尝试通过将以下代码放入for循环来进行简单测试:

    Document findQuery = new Document("userId", "Sham");
    FindIterable<Document> find = collection.find(findQuery);
    MongoCursor<Document> iterator = find.iterator();
    
    即使这样,性能也很慢,需要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
    

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

    • 有很多聚合查询吗?什么样的收藏 你们有什么结构,即
    • 有很多嵌套数组吗
    • 这是一辆汽车吗 单实例还是副本集?尝试将副本集放入“读取” 并写入不同的节点
    • 查询是否从中返回数据 多个集合
    • 检查您的实例有多少操作是页面错误
    • 在高锁定/队列期间,检查日志中是否有高nscanned或SCANNDER的操作,并相应地编制索引
    • 检查对CPU密集型运算符的查询,如$all、$push/$pop/$addToSet,以及对大型文档的更新,尤其是对具有大型数组(或大型子文档数组)的文档的更新
    • 如果您的数据库写得很重,请记住,每个数据库一次只能有一个CPU进行写操作(因为该线程持有写锁)。考虑将数据的一部分移到它自己的数据库中。

    随着时间的推移,这很少会降低性能。我在这里介绍了最常见的用例,但请了解更多细节

    这还取决于您所触发的查询类型,请检查是否存在以下几点-

    • 有很多聚合查询吗?什么样的收藏 你们有什么结构,即
    • 有很多嵌套数组吗
    • 这是一辆汽车吗 单实例还是副本集?尝试将副本集放入“读取” 并写入不同的节点
    • 查询是否从中返回数据 多个集合
    • 检查您的实例有多少操作是页面错误
    • 在高锁定/队列期间,检查日志中是否有高nscanned或SCANNDER的操作,并相应地编制索引
    • 检查对CPU密集型运算符的查询,如$all、$push/$pop/$addToSet,以及对大型文档的更新,尤其是对具有大型数组(或大型子文档数组)的文档的更新
    • 如果您的数据库写得很重,请记住,每个数据库一次只能有一个CPU进行写操作(因为该线程持有写锁)。考虑将数据的一部分移到它自己的数据库中。

    随着时间的推移,这很少会降低性能。我在这里介绍了最常见的用例,但请了解更多细节

    检查您的硬件是否受到限制,磁盘是系统中最大的瓶颈。 要查看硬件是否没有限制,请执行以下操作:

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

    请务必检查您的硬件是否受到限制,磁盘是系统中最大的瓶颈。 要查看硬件是否没有限制,请执行以下操作:

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

    回答你的问题1。这是一个简单的groupby子句。2.三号。单一实例4。不。就第3点而言,需要有复制集,但在此之前,我还可以做其他类型的优化吗?我的应用程序读起来很重,所以你建议我做什么调整吗?回答你的问题1。这是一个简单的groupby子句。2.三号。单一实例4。否。就第3点而言,需要使用ReplicaSet,但在此之前,我可以进行任何其他类型的优化吗?我的应用程序阅读量很大,因此您建议我进行任何调整吗?^以上应该进行评论,但由于声誉较低,我无法添加相同的内容。^以上应该进行评论,但是由于名声不太好,我不能添加相同的内容。