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 毫秒)。我可以做哪些优化来提高更新/插入性能?
要查看硬件是否不受限制:
关于锁定:
如果你有 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/