mongodbのjavascriptパフォーマンス
34728 ワード
mongodbのjavascriptパフォーマンス
mongodbのdb.eval
mongodb javascriptをshell,mongodbのdbとして使用する.evalは、このようなjavascript shellと同様のjsインタフェースをデータ駆動に提供することができる.これはモバイルコードスタイル(Mobile Code Sytles)のアーキテクチャ設計でしょう.このインタフェースを利用して、mongodbのノード上でいくつかの処理ロジックを実行することを望んでいます.PHPでmongodbのデータを複数回取得し操作することを避ける.(この要件は、従来のデータベースのストレージ・プロシージャと同様です)
しかし、テストではmongodbの中でjavascriptを走る性能が理想的ではないことが分かった.私はテストコードを書いて、10000回のサイクルを走りました.
mongodbのdb.eval
mongodb javascriptをshell,mongodbのdbとして使用する.evalは、このようなjavascript shellと同様のjsインタフェースをデータ駆動に提供することができる.これはモバイルコードスタイル(Mobile Code Sytles)のアーキテクチャ設計でしょう.このインタフェースを利用して、mongodbのノード上でいくつかの処理ロジックを実行することを望んでいます.PHPでmongodbのデータを複数回取得し操作することを避ける.(この要件は、従来のデータベースのストレージ・プロシージャと同様です)
しかし、テストではmongodbの中でjavascriptを走る性能が理想的ではないことが分かった.私はテストコードを書いて、10000回のサイクルを走りました.
<?php
$mongo = new Mongo("mongodb://localhost:20237/");
$db = $mongo->selectDB("attl");
$echo_func = <<<JAVASCRIPT
function() {
var str = "xxxxxxxxxxxxxxxxx0000000000";
var data = str + str + str + str;
var data = data + data + data + data;
var max = 10000;
var arr = [];
var total = 0;
for(var a=0; a<100; a++) {
for(var i=0; i<max; i++) {
arr.push( data + " . " + data);
}
for(var i=0; i<arr.length; i++) {
total += arr[i].length;
}
arr = [];
}
return total;
}
JAVASCRIPT;
$bgtime = microtime(true);
$echo_code = new MongoCode($echo_func);
$obj = (object)array("name"=>"dzg", "values"=>array(1,2,3), "bool"=>true) ;
$arr = array(1,2,3,4,5,6,7,8);
$map = array("a"=>1, "b"=>2);
$response = $db->execute($echo_code, array($obj, $arr, $map));
var_dump($response);
$endtime = microtime(true);
echo "
time : ".($endtime - $bgtime)."
";
:
php ab-mongo.php
array(2) {
["retval"]=> float(867000000)
["ok"]=> float(1)
}
time : 6.0353651046753
js 6 ! :
Google Chrome:わずか70ミリ Firefox 5:180ミリ PHP 5による コードの :630 ms のみ
のテストに べてmongodbのjavascriptの があまりにも いことは らかだ.
テスト の
mongodbの ドキュメントServer-side Code Execution:Limitations of eval>Write locksの によると、Write locksが かもしれないと っています.しかし、このような いは とは きく なく、locksは にのみ するべきであり、 の は1 の がこんなに いことである.
また、PHPからmongodbへのjsコードの が いのではないかと しています.
2つの を するために2つの を やしました
dbを します.system.js.save({_id: “mytestfunc”, value: function () { … }}); テストしたjsコードをmongodbでサポートされているStored JavaScriptに します.
dbを します.runCommand({$eval: function() {return mytestfunc();}, nolock:true})のようにnolock び しを う
その 、 は として された. mongodbのJavaScript に がある
Mongodb+V 8 JavaScriptエンジンのテスト
はMongodbのJavaScriptエンジンがSpiderMonkeyであることを っていて、そこでもう1つのv 8バージョンのMongodbをコンパイルすることを みて、 のJavaScriptファイルでテストするつもりです.
テストコードの function dotest() {
var str = "xxxxxxxxxxxxxxxxx0000000000";
var data = str + str + str + str;
var data = data + data + data + data;
var max = 10000;
var arr = [];
var total = 0;
for(var a=0; a<100; a++) {
for(var i=0; i<max; i++) {
arr.push( data + " . " + data);
}
for(var i=0; i<arr.length; i++) {
total += arr[i].length;
}
arr = [];
}
return total;
}
myecho = (typeof console !== 'undefined' && typeof console.log == 'function') ? console.log : print;
a = new Date();
myecho("begin:\t" + a);
myecho("result:\t" + dotest());
b = new Date();
myecho("end:\t" + b);
myecho("total time:\t" + (b - a));
このJavaScriptスクリプトは4つの で に できます.
Chrome/Firefoxなどのブラウザ Node jsのshell SpiderMonkeyのjs shell mongoのjs shell Mongodbのv 8バージョンをコンパイルした 、4つの を してテストするつもりです.
コンパイルmongodb+v 8
OpenSuse 11にいます.4では、linuxのパッケージ ツールでコンパイル を するのは です.
#インストールされたパッケージ:g++subversion git pythonsudo zypper install scons tcsh boost-devel pcre-devel readline-devel
svn checkout http://v8.googlecode.com/svn/trunk/ v8
cd v8
scons
cd ..
git clone git://github.com/mongodb/mongo.git
cd mongov8
scons
#run mongodb v8
./mongod --quiet --shardsvr --dbpath /home/dzg/data/mongodb/test/mongod --port 20237 --nohttpinterface --fork --pidfilepath /home/dzg/data/mongodb/test/mongod.pid --logpath /home/dzg/log/mongodb/test/mongod.log --logappend
ubuntuにインストールするには、いくつかの があります.
1. PCREは、コンパイル にUTF-8のサポートを に すことが ましい.
$ configure --enable-unicode-properties
$ sudo make -j
2
&& make install
PCREがUTF-8をサポートしていない 、MongoDBは できません.
Thu Mar
31
17
:
27
:
16
Assertion:
10342
:pcre not compiled with utf8 support0x8169528 0x81e704e 0x8450212 0xb73b6ce7 0x80f5b11 ./mongod(_ZN5mongo11msgassertedEiPKc+0x208)
[
0x8169528
]
./mongod(_ZN5mongo6RXTest3runEv+0x3fe)
[
0x81e704e
]
./mongod(main+0x3832)
[
0x8450212
]
/lib/libc.so
.6
(__libc_start_main+0xe7)
[
0xb73b6ce7
]
./mongod()
[
0x80f5b11
]
2. Ubutun はSpider Monkeyを っていますが、バージョンは いものもあり、MongoDBに な がサポートされていないものもあり、 にアンインストールする があります.( :アンインストールなし)
$dpkg -l | grep xulrunner
$sudo apt-get remove xulrunner-
1.9.2
-dev xulrunner-
1.9.2
$export CFLAGS
=
”-DJS_C_STRINGS_ARE_UTF8″
$sudo make -f Makefile.ref
$sudo JS_DIST
=
/usr make -f Makefile.ref export
3. boostなどのライブラリをインストールするサポートが です.
$sudo apt-get -y install tcsh git-core scons g++
$sudo apt-get -y install libpcre++-dev libboost-dev libreadline-dev xulrunner-dev
$sudo apt-get -y install libboost-program-options-dev libboost-thread-dev libboost-filesystem-dev libboost-date-time-dev
4. ソースコードはgithubからダウンロードすることを し、 に じて するバージョンをコンパイルします.
$git clone git://github.com/mongodb/mongo.git
$cd mongo
$git tag -l
$git checkout r1
.8.0
5. に、インストールMongoDBをコンパイルする は、ヘッダファイルとライブラリファイルを にすることをお めします.
$scons all
$scons --prefix
=
/opt/mongo --full install
また、MongoDBはGoogle V 8をjsエンジンとして することもでき、 ではV 8がより い かもしれないが、jiraから ると、MongoDBは v 8をデフォルトエンジンに するかもしれない.まずV 8をコンパイルし、 にMongoDBをコンパイルするときにuserv 8パラメータを します.
$svn checkout http://v8.googlecode.com/svn/trunk/ v8
$cd v8
$scons
$sudo cp libv8.a /usr/lib
$sudo cp libv8preparser.a /usr/lib
$sudo cp -r include/* /usr/include/
$cd..
$cd mongo
$scons all --usev8
$scons --prefix
=
/opt/mongo --full --usev8 install
MongoDBは32ビット では くの があり, の にしか いられず,オンライン では ず64ビットシステムを いなければならない.
Thu Mar
31
17
:
24
:
58
--oplogSize of 1024MB is too big for
32
bit version. Use
64
bit build instead.
:http://kb.cnblogs.com/page/96185/ http://www.mongodb.org/display/DOCS/Building+Spider+Monkey http://www.mongodb.org/display/DOCS/Building+for+Linux http://www.howsthe.com/blog/2010/feb/22/mongodb-and-v8/ http://jira.mongodb.org/browse/SERVER-446
テストの
~/opt/mongov 8/mongo localhost:20237 dotest.js
mongo+v 8:93ミリ nodejs:68ミリ SpiderMonkey:442 ms な :
mongodb+v 8は が に く、nodeに い.jsの SpiderMonkey 1.9はv 8より5 いmongodb SpiderMonkeyを すると、mongodb+SpiderMonkeyがmongodb+v 8より60 いという があるに いありません.
mongodbのSpiderMonkeyバージョンが いのかも? はまだmongodbのリリース の で、SpiderMonkeyの なバージョンを らない.
SpiderMonkeyのjsコマンドをテストしたのはxulrunner-1992 からです
テストコードは く、 であり、 の はほぼ され、 に な ではない :http://www.dulao5.com/javascript/2011/07/30/mongodb-javascript-performance.html