MongoDB利用時のレスポンス速度について

810 views
Skip to first unread message

Yusuke Narita

unread,
Jul 29, 2013, 11:44:20 PM7/29/13
to node...@googlegroups.com
はじめて投稿させていただきます、成田と申します。

express3 + mongodb という環境でウェブアプリを作っているのですが、
mongodb からデータを取得する際に大きなデータでもないのに1~2秒かか
ってしまいます。

mongodb への接続は mongoose を使っていて、DBにはサンプルデータが
100件程度入っている程度です。

PHP で同じ DB に接続した場合はストレスなくすぐにレスポンスが返って
くるので、mongod.conf の設定等 mongodb 側の問題ではないように思う
のですが、どういう原因が考えられるでしょうか。

試しに node-mongodb-native を使ってみましたが、多少レスポンスが
よくなりましたがあまり改善されません。(多少早くなりましたが)

サーバは Amazon EC2 の small インスタンス(1CPU、1.7GBメモリ)で、
mongoose は最新バージョン(3.6.15)です。

よろしくお願いいたします。

Manabu Kobayashi

unread,
Jul 30, 2013, 12:00:42 AM7/30/13
to node...@googlegroups.com
例えば、Expressを介さないコマンドラインベースで同様のクエリをmongooseやmongo-db-nativeでやった場合と比べて違いはありますかね。勿論同じインスタンス上で実行しなければなりませんが。あと同じインスタンスから通常のmongoシェルから実行した場合の比較とかもあるとわかりやすいかもしれませn。



2013年7月30日火曜日 Yusuke Narita nar...@gmail.com:
--
 
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Yusuke Narita

unread,
Jul 30, 2013, 12:25:41 AM7/30/13
to node...@googlegroups.com
返信ありがとうございます。

expressを介さずコマンドラインで検証してもやはり1秒以上かかってしまいます。
mongoシェルで同様のクエリを実行するとすぐにレスポンスがあるので、mongoose や node-mongodb-native を使った場合だけ遅くなるようです。
インデックスは正しく設定しています。(といっても100件程度ですが)

検証に使ったコードはこちらです↓

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var db = mongoose.createConnection('mongodb://dbserver:27017/dbname');
var StoreSchema = new Schema({
id: { type: Number, default: 0, required: true },
name: {type: String, required: true, trim: true, match: /^.{1,50}$/},

// (省略)

deleted: {type: Boolean, default: false},
created: {type: Date, required: true, default: Date.now},
updated: {type: Date}
});
mongoose.model('Store', StoreSchema);
var Store = db.model('Store');

var conditions = {};
// (省略)
Store.find(conditions).sort('created').execFind(function(err, stores) {

if (err) {
console.log(err);
process.exit();
}

console.log('store count: ' + stores.length);
process.exit();
});



2013年7月30日火曜日 13時00分42秒 UTC+9 manamanmana:
例えば、Expressを介さないコマンドラインベースで同様のクエリをmongooseやmongo-db-nativeでやった場合と比べて違いはありますかね。勿論同じインスタンス上で実行しなければなりませんが。あと同じインスタンスから通常のmongoシェルから実行した場合の比較とかもあるとわかりやすいかもしれませn。



2013年7月30日火曜日 Yusuke Narita nar...@gmail.com:
はじめて投稿させていただきます、成田と申します。

express3 + mongodb という環境でウェブアプリを作っているのですが、
mongodb からデータを取得する際に大きなデータでもないのに1〜2秒かか
ってしまいます。

mongodb への接続は mongoose を使っていて、DBにはサンプルデータが
100件程度入っている程度です。

PHP で同じ DB に接続した場合はストレスなくすぐにレスポンスが返って
くるので、mongod.conf の設定等 mongodb 側の問題ではないように思う
のですが、どういう原因が考えられるでしょうか。

試しに node-mongodb-native を使ってみましたが、多少レスポンスが
よくなりましたがあまり改善されません。(多少早くなりましたが)

サーバは Amazon EC2 の small インスタンス(1CPU、1.7GBメモリ)で、
mongoose は最新バージョン(3.6.15)です。

よろしくお願いいたします。

--
 
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

小林秀和

unread,
Jul 30, 2013, 12:29:39 AM7/30/13
to node...@googlegroups.com
KOBA789です。

示していただいたコードにて、"dbserver"となっている部分は、実際には IP アドレスになっているのでしょうか。
不自然な遅延というと、DNS の解決を疑いたくなるもので。

2013年7月30日 13:25 Yusuke Narita <nar...@gmail.com>:
>>> このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com
>>> にメールを送信します。
>>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>>
>>>
>
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

Yusuke Narita

unread,
Jul 30, 2013, 12:35:35 AM7/30/13
to node...@googlegroups.com
説明不足ですみません。

dbserver は /etc/hosts に 127.0.0.1 と設定していますのでDNSの名前解決に時間がかかっている訳ではなさそうです。
(運用時にはDB専用サーバを指定しますが、検証用にローカルを指しています。)

試しに localhost に変更してみましたがレスポンス速度は変わりません。

dbnameはデータベース名にハードコーディングしています。

2013年7月30日火曜日 13時29分39秒 UTC+9 KOBA789:
>>> このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com
>>> にメールを送信します。
>>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>>
>>>
>
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

小林秀和

unread,
Jul 30, 2013, 12:41:46 AM7/30/13
to node...@googlegroups.com
KOBA789です。

なるほど。hosts に書いているんですね。
でもまだコネクションの確立に時間がかかっているのか、クエリの実行に時間がかかっているのか切り分けられていないと思うので、conn.on('connected',
callback) でログを吐かせて見てみるといいかもしれません。
reference: http://mongoosejs.com/docs/api.html#connection_Connection-readyState

最終手段としては Wireshark などでクエリのタイミングと内容を見るのもアリかと思います。

2013年7月30日 13:35 Yusuke Narita <nar...@gmail.com>:
>> >>> このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com
>> >>> にメールを送信します。
>> >>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >>>
>> >>>
>> >
>> > --
>> >
>> > ---
>> > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
>> > このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com
>> > にメールを送信します。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >
>> >
>
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

Yusuke Narita

unread,
Jul 30, 2013, 1:08:26 AM7/30/13
to node...@googlegroups.com
成田です。

コネクションが確立される時間を conn.on('connected', callback) で計測してみたところ 290ms - 350ms ほどかかっていました。
時間かかりすぎですよね...。
コネクションの確率とクエリの実行のどちらも時間がかかっているようです。
PHPのmongodbドライバならすぐに返ってくるのでメモリやディスクI/O性能が原因ではないと思うのですが。

2013年7月30日火曜日 13時41分46秒 UTC+9 KOBA789:
>> >>> このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com
>> >>> にメールを送信します。
>> >>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >>>
>> >>>
>> >
>> > --
>> >
>> > ---
>> > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
>> > このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com
>> > にメールを送信します。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >
>> >
>
> --
>
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscribe@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

Manabu Kobayashi

unread,
Jul 30, 2013, 1:13:14 AM7/30/13
to node...@googlegroups.com
ガクです。

確かにそれは時間かかり過ぎですね。
Amazon microインスタントの問題とか切り分けるなら同じ事をローカルのPCとかマシンでやって見るとかかもしれません。


2013年7月30日火曜日 Yusuke Narita nar...@gmail.com:
このグループから退会し、メールの受信を停止するには、nodejs_jp+...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Yusuke Narita

unread,
Jul 30, 2013, 1:24:13 AM7/30/13
to node...@googlegroups.com
成田です。

ローカルマシン(MacBook Pro Retina Core i7 2.6GHz 8コア、16GBMEM)だと 22ms くらいです。
AWSは m1.small インスタンスなので 1vCPU 1.7GBMEM です。

PHPでは早いのに、nodeだと接続に時間かかるというのはもやもやします...。


2013年7月30日火曜日 14時13分14秒 UTC+9 manamanmana:

Yusuke Narita

unread,
Jul 30, 2013, 7:44:47 AM7/30/13
to node...@googlegroups.com
成田です。

mongodbのレスポンスの問題、解決しました。

ふたを開けてみたらしょーもない話しで、node.js を最新バージョンにアップデートしたら格段に早くなりました。
(v0.9.3 → v0.11.4)

まだPHPより接続が遅いのですが、なんとか実用レベルになりそうです。

いろいろアドバイスいただきありがとうございました!

2013年7月30日火曜日 14時24分13秒 UTC+9 Yusuke Narita:
Reply all
Reply to author
Forward
0 new messages