1

Railsコンソールからスクリプトを実行しています。スクリプトはMySQLデータベースをクロールし、最大500万のMongoDBドキュメントを作成します。

スクリプトの実行rails server中に実行すると、リクエストの応答はMOPEDからの数千行の出力を待機する必要があることに気付きました。例:

MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b5"} update={"$set"=>{"questions.1.response"=>{"_id"=>"509043ec2c5f64685b62c5bd", "data"=>{"datepicker"=>"10/21/2011", "response"=>1319216400}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b6"} update={"$set"=>{"questions.2.response"=>{"_id"=>"509043ec2c5f64685b62c5be", "data"=>{"response"=>"Morning"}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b7"} update={"$set"=>{"questions.3.response"=>{"_id"=>"509043ec2c5f64685b62c5bf", "data"=>{"0"=>"yes", "1"=>"no", "2"=>"no", "3"=>"no"}, "comment"=>""}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b8"} update={"$set"=>{"questions.4.response"=>{"_id"=>"509043ec2c5f64685b62c5c0", "data"=>{"response"=>"outdoor"}, "comment"=>""}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b9"} update={"$set"=>{"questions.5.response"=>{"_id"=>"509043ec2c5f64685b62c5c1", "data"=>{"response"=>"5"}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5ba"} update={"$set"=>{"questions.6.response"=>{"_id"=>"509043ec2c5f64685b62c5c2", "data"=>{"response"=>"attest"}, "comment"=>nil}}} flags=[] (1.0002ms)

(Railsサーバーが実行されている状態で)スクリプトを十分に長く実行させると、httpリクエストは次のようになります。

[2012-10-30 16:24:44] ERROR Java heap space
[2012-10-30 16:25:12] ERROR Java heap space
[2012-10-30 16:26:11] ERROR Java heap space

だから、私の質問は:この動作を防ぐための設定はありますか?また、MongoDBに書き込むときに、サーバートラフィックが妨げられることを期待する必要がありますか?

MongoidRails 3.2JRuby 1.7.0MongoDB2.2.0を使用しています

4

1 に答える 1

0

MongoDBでは、一度に1つの操作のみを書き込むことができます。この書き込みロックの範囲はバージョンごとに異なります。以前はサーバー全体でしたが、最近のバージョンではよりきめ細かくなっています。http://docs.mongodb.org/manual/faq/concurrency/を参照してください

とはいえ、すべてのupdateコマンドの後にロックを解除する必要があります。したがって、Railsサーバーは、スクリプトからの個々の更新コマンドに匹敵する遅延でリクエストを処理できる必要があります。そうでない場合は、何か他のことが起こっている必要があります。

MMSをインストールし、ロック%とキューの長さのグラフを見て、書き込みロックが原因でバックアップがどのように取得されているかを確認することをお勧めします。

于 2013-04-19T19:11:58.477 に答える