MongoDB高CPU使用率/长读取时间

时间:2016-12-12 19:26:46

标签: mongodb perl

我是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
  • 当程序运行时,我看到indexSize和dataSize发生了变化(通过Mongo shell中的db.stats()),这让我觉得它们至少在某种程度上被使用了
  • 这可能会受到我电脑电源的影响吗?我的印象是索引应该使很多这个过程对计算机来说非常容易管理

1 个答案:

答案 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

相关问题