perl – 如何加快MongoDB插入/秒?

前端之家收集整理的这篇文章主要介绍了perl – 如何加快MongoDB插入/秒?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图最大化每秒插入。我目前大约有20k插入/秒。我的性能实际上降低了我使用的线程和cpu(我有16个核心可用)。 2个线程目前每秒在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();

解决方法

写入MongoDB目前获得一个全局写锁,虽然 collection level locking希望即将到来。通过使用更多的线程,你可能会引入更多的并发问题,因为线程在等待锁被释放时阻塞了。

索引也会减慢您的速度,为了获得最佳的插入性能,在加载数据后添加它们是理想的,但这并不总是可能的,例如,如果您使用唯一索引。

要真正最大限度地提高写性能,最好的选择是分片。这将给你一个更好的并发和更高的磁盘I / O容量,因为您在多台机器上分配写入。

原文链接:https://www.f2er.com/Perl/173349.html

猜你在找的Perl相关文章