2013-03-01 4 views
7

私は、現在の問題がどこにあるのかをより正確に特定する方法を理解しようとしています。Mongoタイムアウトのロック率の保存に関する理解

現在、私は、サードパーティベンダーから(問題なし)15分ごとに情報をダウンロードし、cronを経由コレクションを更新しています。 2年のリフレッシュが必要な時があり、この問題を見る時があります。

私はmongo-> collection-> save($ item)を使っています。私はすべての結果のために_idを持っているので、(私が思ったように)ヒットしたのはクイックインサートでした。

文書のサイズはあまり変更されておらず、始めるにはやや小さい(12kb〜)。

Iバッチサードパーティのサーバーには約200の要求ごとにダウンロード、それらをフォーマットし、trueに設定し、安全な挿入で保存使用してモンゴに一度にそれらを1つずつ挿入します。

現在、保存が行われているときは、ロックの割合が20〜30%になります。私はタイムアウト(100秒に設定されている)を打つことになった理由は、これがなぜ起こっているのかを追跡する方法が不思議です。

  • タイムアウトエラー:MongoCursorTimeoutExceptionオブジェクト - >カーソルがタイムアウト(時間切れ:100000を、時間は左:0:0を、状態:0)

  • モンゴドライバ:Mongoのネイティブドライバ1.2.6(PHPから.net)

私は現在SSDドライブと16GBのRAMを搭載したMongo 2.2.1を使用しています。ここで

は、挿入が起こっている間、私は従うmongoStat動作の例である:

insert query update delete getmore command flushes mapped vsize res  faults    locked db    idx miss %  qr|qw ar|aw netIn netOut conn set   repl time 
    0  0  201 0  215  203  0  156g 313g  1.57g  7     mydb:36.3%    0    0|0  0|0 892k 918k 52 a-cluster PRI  10:04:36 

私がやってPHPを使用して、二次設定と(ドキュメントの提案ごとに)それらに面しARBとの主を持っています私の挿入物。

どのようなヘルプも大いにお勧めします。

お時間をどうもありがとうございます更新

の各要素にフォーマットするには、これらの項目をバッチ処理時に、必要とされることがございますように私は「MongoDoc」内のすべての項目を保存しますそこに私は、私はそれにそれをチョーキングだ今のように私は(私は安全な書き込みを削除していると私は、タイムアウトの発生を大幅に削減を見てきたと言うだろうからデータを取得し、

$mongoData = $mongoSpec->getData(); 
try { 
    foreach($mongoData as $insert) { 
     $this->collection_instance->save($insert); 
     $count++; 
    } 
} catch(Exception $e) { 
    print_r($e->getTrace()); 
    exit; 
} 

として挿入しますアンルインサートに何か問題があります。)

ありがとうございました。

+0

'MongoCursorTimeoutException'が発生します。だから、それを挿入物に見るべきではない。その例外をスローするステートメントは何ですか? – JohnnyHK

+0

安全な保存メソッドコールを実行するとタイムアウトします。挿入する少数の他のドキュメントのリストを含む新しいドキュメントを挿入しているとき。 – Petrogad

+1

いくつかのコードを含めることができますか?ここに何かがないようです。ところで、あなたは200のバッチで文書を取得していると言います - どうしていますか?ファイルに入っていますか?または別のDB? –

答えて

1

PHPの実行上限に達していますか?あなたはどのMongoライブラリを使用していますか?私はFuelPHPのMongoDbライブラリを使用していましたが、〜50個の挿入(各書き込みは確認済みのfsyncされた操作であるため)にほぼ1秒かかるので、これは私を驚かせるものではありません。私の解決策は、fsyncと一定の間隔でのみ確認を書き込むことでした。何故なら、何の問題もないという合理的な保証があれば、はるかに優れたパフォーマンスが得られます。

さらに詳しい情報:あなたは100秒、カーソルの作成経過した後に前のクエリの結果からデータを取得するために、カーソルを使用する場合
http://docs.mongodb.org/manual/reference/command/fsync/
http://docs.mongodb.org/manual/core/write-operations/#write-concern

+0

ありがとうございます。私は現在、php.netに見られるようにMongo 1.2.6ネイティブドライバを使用しています。正確なエラーメッセージは、カーソルタイムアウト(タイムアウト:100000、左時間:0:0、ステータス:0)でした。上記の解決策がまだ機能しているかどうかは不明ですか? FuelPHPライブラリに切り替えるには、Mongoドライバではなく、それが使用する呼び出しのコードを更新する必要がありますか?ありがとうございました! – Petrogad

+0

燃料は、ネイティブドライバの単なるラッパーなので、切り替える必要はありません。書込み問題とfsyncの問題は引き続き適用されます。 – landons

+0

優秀、情報ありがとうございます。調査して報告します。 – Petrogad

関連する問題