2011-08-01 12 views
7

Webアプリケーション用に集中的なMongoDBを実行しており、パフォーマンスが非常に低下しています。これは言われているように、私は問題がmongo自体よりも私たちのコード、セットアップ、および/または私たちの使用方法と関連があることをかなり確信しています。書き込み集中型アプリケーションのMongoDBのパフォーマンスが異常に低い

私は頭が切れているのを見失ってしまったので、何か問題があるように見えるように準備した出力の一部を見てもらえないかと思っていました。

コードは(それがところで、PHPにあります)あまりにも複雑ではありません。かなり多くの - > find()と - > update()です。私は両方の呼び出しにインデックスを使用するようにしました。そして、実際にクエリでexplain()を実行して使用されていることを確認しました。

私は1台のサーバー(ec2 m2.2xlarge)、4台のサーバー(2台の2つの担当者)、9台のサーバー(3つの3つの担当者)を試しましたが、それらの多くを得ることはできませんでした。

良い状態では、1秒間に1500回以上の書き込みを行うことはできません(挿入+更新)。ほとんどの場合、私は100の挿入/更新の合計量に達することができて幸運です。私は常に大きな "ロックされた%"と多くのクエリが "qr | qw"をキューに入れました。

現在、私は実行中のスクリプトを持っていて、それはクロールしています。最悪の場合、mongostatをしばらく見ていると、「res」で使用されるRAMの量はサーバーの使用可能なRAMの約50%であり、すべてのコレクションのインデックスに適合するRAM以上のRAMがあります。これが狂ったようなデータを吐き出さない理由はありません。

データのアクセスパターンを改善するために、すでにアプリを2-3回レコーディングしておく必要があります。私はインデックス上で読むことができるもの、更新するもの、シャード・キーと何かを読んだことがあります。私がmongoを置いているすべてのサーバーは、8つのEBSディスクを使用して、いくつかのパフォーマンスの調整を追加しました(blockdev、noatime、etc ...)。

私はこの問題が私の目的であり、私はmongodbを責めないと知っています。私は大規模な企業が、集中的なアプリケーションを書くためにそれを使用していて、絶対に愛用していることを知っています(例えば四角形)。同時に、私は何が間違っているのか、私が何をしているにせよ、なぜこのようなパフォーマンスが悪いのか理解できません。

追加情報:

  • すべてのサーバ(クライアントおよびサーバー)は、1.8.2
  • すべてのサーバーはEC2東にと
  • 現在、同じゾーンにあるのMongoDBでのUbuntu 10.04 LTSを実行しているI私は問題がどこにあるかを知ることができるまで、1平方メートルの大きなサーバー(4コア、34.2 GB RAM)に戻ります。

答えて

10

最初の問題は、ディスクが書き込みではなく読み込みで主に占有されているように見えることです。 (iostatに基づく)。あなたの利用率は50%を超えていますが、基本的にはすべての読み込みです。

DBの統計情報を見ると、35GBのインデックスと41GBのデータが133GBの割り当てファイルにあります。 133GBは、mappedの数字にかなり近いです(mongostat)。したがって、アクセスしているデータの合計は約120GBまたは約4x RAMです。

通常、4xは完全に細かい比率です。しかし、あなたの場合、あなたはRAMを超えるインデックスを持っています。これはMongoDBのパフォーマンスの "低下"の原因になりがちです。

インデックスをランダムにアクセスする場合は、ほとんどまたはすべてのインデックスがメモリに格納されます。これは、ほとんどのデータがメモリになく、ディスクから「ページイン」する必要があることを意味します。読んでいる重いディスクの読み取りでこれを見ることができます。

シャーディングでテストしたとおっしゃいますが、そのテストの数値はありますか?データは3つすべてのシャードに正しく分散されていましたか?

シャーディングはDBに「RAMを追加」しているにも関わらず、データが実際に均等に分割され、正しく動作するか、問題を解決できないことを確認する必要があります。

+2

+1また、(割り当てられた空き容量を超えているために)アップデートを実行できない場合は、ディスクから読み込み、メモリに書き込んだり、変更したり、書き戻したりする必要がありますデータセット。 –

関連する問題