我是MongoDB的新用户,我希望能指出正确的方向。随着这个问题的发展,我将提供我错过的任何其他所需信息。
我正在使用Perl程序通过MongoDB cpan模块上传和注释/修改文档到/在MongoDB数据库中。正在使用(我相信)这个程序的索引,但我遇到的问题是从MongoDB读取的时间越来越长。基于mongotop,读取需要约500毫秒,写入时间仅为10-15毫秒。允许程序运行相当长的一段时间后,读取时间显着增加,运行数小时后耗时超过3000毫秒。
在使用top运行程序时监控程序,Perl的CPU使用率约为10-20%,而MongoDB的CPU使用率为70-90%。运行时,在几分钟内Perl降至5%以下,mongoDB为90-95%。运行了更长的时间(12个小时以上)后,MongoDB的CPU使用率约为98%,而Perl约为0.3%,但仅在顶部每5-10秒弹出一次。
基于这种趋势,索引问题似乎很有可能,但我不知道如何检查这一点,而且我所知道的是,至少已经制作了适当的索引,但不一定正在使用。
其他信息:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 19209
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 19209
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
答案 0 :(得分:1)
听起来很像它可能正在进行集合扫描而不是使用索引。即随着你的收藏增长,阅读速度越来越慢。
如果您正在使用class Array
def merge(other_array)
other_array + (self[other_array.size..-1] || [])
end
end
方法,则可以在生成的游标上运行find
以获取有关查询将如何执行的信息。
这是一个简单的例子:
explain
只看输出的'winnerPlan'部分就可以看到'COLLSCAN':
use MongoDB;
use JSON::MaybeXS;
my $coll = MongoDB->connect->ns("test.foo");
$coll->drop();
$coll->insert_one({x => $_}) for 1 .. 1000;
my $cursor = $coll->find({x => 42});
my $diag = $cursor->explain;
my $json = JSON::MaybeXS->new(
allow_blessed => 1, convert_blessed => 1, pretty => 1, canonical => 1
);
print $json->encode($diag->{queryPlanner}{winningPlan});
现在我将再次执行此操作,但首先在使用{
"direction" : "forward",
"filter" : {
"x" : {
"$eq" : 42
}
},
"stage" : "COLLSCAN"
}
插入之前在'x'上创建索引。您可以在输出中看到查询计划现在正在使用索引(IXSCAN)。
$coll->indexes->create_one([x => 1])
您可以从完整的“解释”输出中发现更多内容。您可以观看MongoDB World 2016的精彩视频,了解有关它的更多信息:Deciphering Explain Output。