我正在尝试最大化每秒插入的数量。目前,我的性能随着使用的线程和CPU数量增加而降低(我有16个可用核心)。在一个16核双处理器机器上,两个线程比16个线程每秒执行更多操作。您有什么想法是问题出在哪里?是因为我只使用了一个mongod吗?是索引导致速度变慢吗?我需要使用分片吗?我想知道是否有一种方式可以分片,但同时也保持数据库的容量限制...
约束条件:必须处理约300k次每秒的插入操作,必须具有自我限制功能(容量限制),必须能够相对快速地查询。
问题空间:必须处理一家重要手机公司的通话记录(约300k次每秒的插入操作),并使这些通话记录在尽可能长的时间内(例如一周)可查询。
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use threads::shared;
use MongoDB;
use Time::HiRes;
my $conn = MongoDB::Connection->new;
my $db = $conn->tutorial;
my $users = $db->users;
my $cmd = Tie::IxHash->new(
"create" => "users",
"capped" => "boolean::true",
"max" => 10000000,
);
$db->run_command($cmd);
my $idx = Tie::IxHash->new(
"background"=> "boolean::true",
);
$users->ensure_index($idx);
my $myhash =
{
"name" => "James",
"age" => 31,
# "likes" => [qw/Danielle biking food games/]
};
my $j : shared = 0;
my $numthread = 2; # how many threads to run
my @array;
for (1..100000) {
push (@array, $myhash);
$j++;
}
sub thInsert {
#my @ids = $users->batch_insert(\@array);
#$users->bulk_insert(\@array);
$users->batch_insert(\@array);
}
my @threads;
my $timestart = Time::HiRes::time();
push @threads, threads->new(\&thInsert) for 1..$numthread;
$_->join foreach @threads; # wait for all threads to finish
print (($j*$numthread) . "\n");
my $timeend = Time::HiRes::time();
print( (($j*$numthread)/($timeend - $timestart)) . "\n");
$users->drop();
$db->drop();