4

我们的测试工具创建 n 个线程并在每个线程内执行 m 次迭代。我们计算最小、平均和最大操作时间。所以我们不时看到 mongo 执行请求非常慢 - 最多几秒钟。此外,每次第一次操作最慢时,我们甚至故意将其从统计数据中排除,但 avg 和 max 之间的差异仍然很大。正常吗?我可以消除那些缓慢的操作吗?为什么mongo执行一些请求非常慢?

当我们同时运行插入/获取/删除/更新测试时,单操作模式和混合模式的结果如下。在混合模式下 thread=1 意味着我们为每种类型的测试创建了 4 个线程 Mongo性能测试

我们使用默认值 - 每台主机 100 个连接

资源

public void storeMt(MyTestObject myTestObject) {
    mongoTemplate.insert(myTestObject );
  }

  public MyTestObject getMt(long id) {
    MyTestObject result = mongoTemplate.findById(id, MyTestObject.class);
    return result;
  }


@Document
public class MyTestObject implements Serializable {

  private static final long serialVersionUID = 1L;
  @Id
  private long id;
//class contains 20+ fields
.......
4

2 回答 2

5

我认为这可能发生的原因很少。

  1. 这不是由于 mongoDB 可能是由于 java 进程。一开始需要时间来启动和加载(分配内存)内存中的相关变量。
  2. 使用 MongoDB 的监控工具 MMS 来查看数据库是否是瓶颈。您可以检查数据库的锁定、网络使用情况、内存使用情况。
  3. MongoDB 获取当前版本的数据库级别的锁定。因此,如果您的查询针对的是同一个数据库(单个数据库的不同或相同集合),它可能会减慢操作速度。
  4. 此外,添加更多线程数不一定会提高性能。由于 CPU、内存(RAM)等的额外负载,它可能会降低性能。所以,我建议在频繁间隔后增加线程数,然后看看性能何时停止改善。

我相信如果你这样做,你会发现它变慢的确切原因。

干杯!

于 2015-03-09T04:44:09.263 回答
0

我认为这是一种预期的行为,每当执行查询时,(获胜的)查询计划都会被缓存以供进一步检索。

该查询缓存也一次又一次地被转储,因此有时需要更长的时间。

在您的情况下,某些查询似乎代价高昂,我认为您需要识别这些查询并采取措施提高性能,如果是读取查询,则可能需要(复合)索引。

如果是写查询,还需要进一步分析,它是什么类型的集合?它有哪些索引以及文档的数量是多少?

这是有关查询计划缓存的更多信息

于 2016-09-20T17:43:14.847 回答