成田です。 mongodbのレスポンスの問題、解決しました。
ふたを開けてみたらしょーもない話しで、node.js を最新バージョンにアップデートしたら格段に早くなりました。 (v0.9.3 → v0.11.4) まだPHPより接続が遅いのですが、なんとか実用レベルになりそうです。 いろいろアドバイスいただきありがとうございました! 2013年7月30日火曜日 14時24分13秒 UTC+9 Yusuke Narita: > > 成田です。 > > ローカルマシン(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: >> >> ガクです。 >> >> 確かにそれは時間かかり過ぎですね。 >> Amazon microインスタントの問題とか切り分けるなら同じ事をローカルのPCとかマシンでやって見るとかかもしれません。 >> >> >> 2013年7月30日火曜日 Yusuke Narita [email protected]: >> >>> 成田です。 >>> >>> コネクションが確立される時間を conn.on('connected', callback) で計測してみたところ 290ms - 350ms >>> ほどかかっていました。 >>> 時間かかりすぎですよね...。 >>> コネクションの確率とクエリの実行のどちらも時間がかかっているようです。 >>> PHPのmongodbドライバならすぐに返ってくるのでメモリやディスクI/O性能が原因ではないと思うのですが。 >>> >>> 2013年7月30日火曜日 13時41分46秒 UTC+9 KOBA789: >>>> >>>> KOBA789です。 >>>> >>>> なるほど。hosts に書いているんですね。 >>>> でもまだコネクションの確立に時間がかかっているのか、**クエリの実行に時間がかかっているのか切り分けられていないと思**うので、conn.on('connected', >>>> >>>> >>>> callback) でログを吐かせて見てみるといいかもしれません。 >>>> reference: http://mongoosejs.com/docs/**api.html#connection_** >>>> Connection-readyState<http://mongoosejs.com/docs/api.html#connection_Connection-readyState> >>>> >>>> >>>> 最終手段としては Wireshark などでクエリのタイミングと内容を見るのもアリかと思います。 >>>> >>>> 2013年7月30日 13:35 Yusuke Narita <[email protected]>: >>>> > 説明不足ですみません。 >>>> > >>>> > dbserver は /etc/hosts に 127.0.0.1 >>>> > と設定していますのでDNSの名前解決に時間がかかっている訳で**はなさそうです。 >>>> >>>> > (運用時にはDB専用サーバを指定しますが、**検証用にローカルを指しています。) >>>> > >>>> > 試しに localhost に変更してみましたがレスポンス速度は変わりません。 >>>> > >>>> > dbnameはデータベース名にハードコーディングしています。 >>>> > >>>> > 2013年7月30日火曜日 13時29分39秒 UTC+9 KOBA789: >>>> >> >>>> >> KOBA789です。 >>>> >> >>>> >> 示していただいたコードにて、"dbserver"**となっている部分は、実際には IP アドレスになっているのでしょうか。 >>>> >> 不自然な遅延というと、DNS の解決を疑いたくなるもので。 >>>> >> >>>> >> 2013年7月30日 13:25 Yusuke Narita <[email protected]>: >>>> >> > 返信ありがとうございます。 >>>> >> > >>>> >> > 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 [email protected]: >>>> >> >> >>>> >> >>> はじめて投稿させていただきます、成田と申します。 >>>> >> >>> >>>> >> >>> 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 日本ユーザグループ」の登録者に送られています。 >>>> >> >>> このグループから退会し、メールの受信を停止するには、node**js_jp+unsubscribe@** >>>> googlegroups.com >>>> >> >>> にメールを送信します。 >>>> >> >>> その他のオプションについては、https://groups.**google.com/groups/opt_out<https://groups.google.com/groups/opt_out>にアクセスしてください。 >>>> >> >>> >>>> >> >>> >>>> >> >>> >>>> >> > >>>> >> > -- >>>> >> > >>>> >> > --- >>>> >> > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 >>>> >> > このグループから退会し、メールの受信を停止するには、node**js_jp+unsubscribe@** >>>> googlegroups.com >>>> >> > にメールを送信します。 >>>> >> > その他のオプションについては、https://groups.**google.com/groups/opt_out<https://groups.google.com/groups/opt_out>にアクセスしてください。 >>>> >> > >>>> >> > >>>> >> > >>>> > >>>> > -- >>>> > >>>> > --- >>>> > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 < >>> >>> -- >>> >>> --- >>> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 >>> このグループから退会し、メールの受信を停止するには、[email protected]にメールを送信します。 >>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。 >>> >>> >>> >> -- --- このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。 その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
