Node.js의 성능을 MongoDB에서 테스트하고 있습니다. 나는 이것들 각각이 다른 것과 독립적으로 독립적이라는 것을 알지만, 나는 그들에 대한 느낌을 얻기 위해 소수의 테스트를 시도하고있다. 나는이 문제를 겪었고 소스를 결정하는 데 문제가있다.node-mongodb-native의 성능을 삽입하십시오.
나는 하나의 Node.js를 프로그램에서 1,000,000 레코드를 삽입하기 위해 노력하고있어
문제점. 절대적으로 크롤링합니다. 우리는 20 분의 실행 시간을 말하고 있습니다. 이것은 Mac이나 CentOS 이건간에 발생합니다. 그것은 결국 완료됩니다.
효과는 스와핑과 비슷하지만 메모리는 2GB를 넘지 않습니다. MongoDB에는 3 개의 연결 만 열려 있으며 대부분의 경우 데이터가 삽입되지 않습니다. 많은 컨텍스트 스위칭을 수행하는 것으로 보입니다. Node.js CPU 코어는 최대치입니다.
효과는 this thread에서 언급 한 것과 유사합니다.
나는 PHP를 사용하여 같은 것을 시도하고 2 ~ 3 분 내에 완료된다. 드라마가 없습니다.
왜? 가능한
는
나는 현재이는 Node.js를 소켓 문제, 뒤에서 libev로 계속 뭔가, 또는 다른 노드 MongoDB의 네이티브 문제 중 하나라고 생각하도록합니다. 나는 완전히 틀릴지도 모른다. 그래서 나는 약간의 지침을 찾고있다.
다른 Node.js MongoDB 어댑터에 대해서는 몽골어를 사용해 보았습니다. 배치를 삽입하기 위해 문서를 큐에 넣은 것처럼 보이며 메모리가 부족한 상태로 끝납니다. 그게 다야. (사이드 노트 : 16 GB 박스 제한에 근접하지도 않았으므로이 점도 이해할 수 없다.하지만 그것에 대해서는 더 이상 조사하지 않았다.)
나는 아마도 내가 실제로 쿼터 코어 머신에서 4 명의 작업자가있는 마스터/작업자 클러스터를 테스트했음을 언급하고 2 ~ 3 분만에 마쳤습니다.
강령
은 여기 내 Node.js를 커피 스크립트 프로그램입니다 :
mongodb = require "mongodb"
microtime = require "microtime"
crypto = require "crypto"
times = 1000000
server = new mongodb.Server "127.0.0.1", 27017
db = mongodb.Db "test", server
db.open (error, client) ->
throw error if error?
collection = mongodb.Collection client, "foo"
for i in [0...times]
console.log "Inserting #{i}..." if i % 100000 == 0
hash = crypto.createHash "sha1"
hash.update "" + microtime.now() + (Math.random() * 255 | 0)
key = hash.digest "hex"
doc =
key: key,
foo1: 1000,
foo2: 1000,
foo3: 1000,
bar1: 2000,
bar2: 2000,
bar3: 2000,
baz1: 3000,
baz2: 3000,
baz3: 3000
collection.insert doc, safe: true, (error, response) ->
console.log error.message if error
그리고 여기에 거의 상응하는 PHP 프로그램이다 :
<?php
$mongo = new Mongo();
$collection = $mongo->test->foo;
$times = 1000000;
for ($i = 0; $i < $times; $i++) {
if ($i % 100000 == 0) {
print "Inserting $i...\n";
}
$doc = array(
"key" => sha1(microtime(true) + rand(0, 255)),
"foo1" => 1000,
"foo2" => 1000,
"foo3" => 1000,
"bar1" => 2000,
"bar2" => 2000,
"bar3" => 2000,
"baz1" => 3000,
"baz2" => 3000,
"baz3" => 3000
);
try {
$collection->insert($doc, array("safe" => true));
} catch (MongoCursorException $e) {
print $e->getMessage() . "\n";
}
}
글쎄, 공정하게 당신은 내 사용 사례를 정말로 모른다. 이것은 단지 하나의 테스트 일뿐입니다. 흥미로운 결과를 얻었고 Node.js 전체 또는 특정 모듈에 적용했는지 궁금합니다. 어쨌든 원인을 이해하면 Node.js 및/또는이 모듈을보다 효과적으로 사용하는 방법을 더 잘 이해할 수 있습니다. :-) –
사실은 클라이언트 라이브러리 일 수도 있습니다. – hakre
node.js CPU 코어가 초과 된 경우 이미 문제를 발견하지 못했습니다. 모든 단일 프로세스 JS 기반 애플리케이션 서버는 최대 처리량에 가까운 것을 달성하지 못합니다. 같은 상자에서 여러 node.js 프로세스를 시작하면 어떻게됩니까? 솔직하게 말해서 나는 node.js가 웹 애플 리케이션 개발 스펙트럼의 더 전문적인 끝에 왜 이런 종류의 이유가 있지만 어째서 왜 그런지에 대해 완전히 신비 스럽다. –