我有一个包含3台服务器的副本集(QuadCore,64 GB RAM,SSD - HW-Raid)。
大多数查询通常都非常快,例如一个简单的查询{ShortKey:" ABC"}在一个包含176个文档的小集合中,每个文档都非常小。在大多数情况下,查询大约需要1毫秒,但有时执行时间非常长。
分析器显示它等待很长时间才能锁定。我不明白的是这个db的锁定百分比大约是2%。所以问题是:是否有任何全局锁定(例如复制)以及我可以做些什么来改进它?
{
"op" : "query",
"ns" : "bls_read.CompanySet",
"query" : {
"ShortKey" : "ABC"
},
"ntoskip" : 0,
"nscanned" : 148,
"nscannedObjects" : 148,
"keyUpdates" : 0,
"numYield" : 1,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(874),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(4330712),
"w" : NumberLong(14774)
}
},
"nreturned" : 1,
"responseLength" : 441,
"millis" : 4298,
"execStats" : {
"type" : "LIMIT",
"works" : 149,
"yields" : 1,
"unyields" : 1,
"invalidates" : 0,
"advanced" : 1,
"needTime" : 148,
"needFetch" : 0,
"isEOF" : 1,
"children" : [{
"type" : "COLLSCAN",
"works" : 149,
"yields" : 1,
"unyields" : 1,
"invalidates" : 0,
"advanced" : 1,
"needTime" : 148,
"needFetch" : 0,
"isEOF" : 0,
"docsTested" : 148,
"children" : []
}]
}
}
答案 0 :(得分:1)
在可能的情况下,您的查询可能会受到影响 - 这取决于系统要求 - 可以打到辅助设备。
考虑将您的查询read preference更改为默认Secondary
的{{1}}或secondaryPreferred
。
默认情况下,应用程序将其读取操作定向到副本集中的主要成员。阅读主要保证 读取操作反映了文档的最新版本。 但是,通过将部分或全部读取分发给辅助成员 副本集,您可以提高读取吞吐量或减少延迟 不需要完全最新数据的应用程序。