Mongodb 高锁百分比/慢查询

Ali*_*air 4 performance mongodb optimization query-performance

我正在处理一个使用 MongoDB 的应用程序,该应用程序收到了相当多的传入请求,我注意到响应随着请求数量的增加而变慢。

我怀疑数据库效率低下。我在一个较高负载期间运行了 mongostat,结果似乎表明锁定百分比很高:

insert  query update delete getmore command flushes mapped  vsize    res faults           locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn set repl       time
*0   1120    479     *0     179   472|0       0  72.1g   146g  1.31g      0 server-prod:15.7%          0       0|0     1|0     1m     4m   298 rs0  PRI   15:37:28
*0   1192    509     *0     178   428|0       0  72.1g   146g   1.3g      0 server-prod:18.9%          0       0|0     0|0     1m     5m   298 rs0  PRI   15:37:29
*0   1107    456     *0     174   362|0       0  72.1g   146g   1.3g      0 server-prod:20.4%          0       0|0     2|1     1m     5m   298 rs0  PRI   15:37:30
*0   1320    556     *0     211   532|0       0  72.1g   146g   1.3g      0 server-prod:19.5%          0       0|0     0|1     1m     6m   298 rs0  PRI   15:37:31
*0   1094    474     *0     179   449|0       0  72.1g   146g   1.3g      0 server-prod:15.7%          0       0|0     0|0     1m     5m   298 rs0  PRI   15:37:32
*0   1120    487     *0     184   458|0       0  72.1g   146g   1.3g      0 server-prod:20.8%          0       0|0     1|1     1m     5m   298 rs0  PRI   15:37:33
*0    807    299     *0     108   270|0       0  72.1g   146g   1.3g      0 server-prod:15.3%          0     103|1     0|3     1m     3m   298 rs0  PRI   15:37:34
*0   1613    709     *0     161   146|0       0  72.1g   146g   1.3g      0 server-prod:63.5%          0       0|0     1|0     2m     7m   298 rs0  PRI   15:37:35
*0   1133    472     *0     167   341|0       0  72.1g   146g  1.31g      0 server-prod:21.2%          0       1|0     0|1     1m     6m   298 rs0  PRI   15:37:36
*0   1292    555     *0     189   440|0       0  72.1g   146g  1.31g      0 server-prod:23.3%          0       5|0     1|4     2m     6m   298 rs0  PRI   15:37:37
Run Code Online (Sandbox Code Playgroud)

底部第三行的锁定百分比为 60%,考虑到平均锁定百分比约为 20%,这非常疯狂。在更高的负载下,平均值上升到 35-40%。

我还在我的生产 mongo shell 中运行了 show log 并且没有看到运行时间低于 100 毫秒的单个查询。一些查询的执行时间约为 700 毫秒到 1 秒。

运行数据库的机器也可能是问题所在(n1-standard-1(1 个 vCPU,3.8 GB 内存)谷歌计算引擎 VM 实例)。该数据库也被构造为一个三成员副本集(一个主节点和两个辅助节点,没有仲裁器)。

有哪些方法可以排除故障并提高查询速度?

谢谢!

编辑:忘了提及我正在使用 Mongo v2.6

编辑:这是 db.stats() 的输出

{
"db" : "server-prod",
"collections" : 20,
"objects" : 36560,
"avgObjSize" : 359.20568927789935,
"dataSize" : 13132560,
"storageSize" : 43479040,
"numExtents" : 62,
"indexes" : 24,
"indexSize" : 6189232,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"dataFileVersion" : {
    "major" : 4,
    "minor" : 5
},
"extentFreeList" : {
    "num" : 0,
    "totalSize" : 0
},
"ok" : 1
Run Code Online (Sandbox Code Playgroud)

}

编辑:昨晚我看到我的 CPU 在高峰负载时间上升到 128%,这怎么可能?(这是单核机)

编辑:我在一些查询最多的字段上创建了索引,并注意到性能有所提高,但是,更新查询仍然花费太长时间(~500-800 毫秒)。我可以做哪些优化来提高更新/插入性能?

ald*_*win 5

要查看硬件是否不受限制:

  • top/htop => cpu 百分比
  • iostat -x 1 => sysstat 工具查看磁盘读写限制 (%util)

关于锁定:

  • Mongo 2.6:数据库锁定
  • Mongo 3.0 + MMAPv1 存储引擎:集合锁定
  • Mongo 3.0 + WiredTiger 存储引擎:文档锁定

如果你有 1 个巨大的集合(服务器生产),也许分片是分配负载的一种选择,或者更多的内核 + 更少的锁定与 Mongo3.0

改进索引: - 更多索引 = 更慢的写入 + 更快的读取 - 更少的索引 = 更快的写入 + 更慢的读取

从次要读取,只在主要写入。

> db.setProvilingLevel(1,4)  ##  save slow logs for that db slower than 4ms
> db.system.profile.find({millis:{$gt:100}}).sort({ts:-1}) ## find queries slower than 100ms, order by timestamp descending
> ....query.explain()  ## find out which indexes it uses
Run Code Online (Sandbox Code Playgroud)

信息:http : //docs.mongodb.org/manual/administration/optimization/