4

テスト ツールは n 個のスレッドを作成し、各スレッド内で m 回の反復を実行します。最小、平均、最大操作時間を計算します。そのため、mongo がリクエストを非常に遅く実行することがあります (最大数秒)。また、最初の操作が最も遅くなるたびに、統計から意図的に除外することさえありますが、それでも平均と最大の差は非常に大きくなります。それは正常ですか?これらの遅い操作をなくすことはできますか? mongo が一部のリクエストを非常に遅く実行するのはなぜですか?

以下は、挿入/取得/削除/更新のテストを同時に実行したときの単一操作モードと混合モードの結果です。mix モードで thread=1 は、テストの種類ごとに 1 つずつ、4 つのスレッドを作成したことを意味します。 Mongo パフォーマンス テスト

デフォルト値を使用しました - ホストあたり 100 接続

ソース

public void storeMt(MyTestObject myTestObject) {
    mongoTemplate.insert(myTestObject );
  }

  public MyTestObject getMt(long id) {
    MyTestObject result = mongoTemplate.findById(id, MyTestObject.class);
    return result;
  }


@Document
public class MyTestObject implements Serializable {

  private static final long serialVersionUID = 1L;
  @Id
  private long id;
//class contains 20+ fields
.......
4

2 に答える 2

5

これが発生する理由はいくつかあります。

  1. mongoDB が原因ではなく、Java プロセスが原因である可能性があります。関連する変数をメモリに起動してロード(メモリの割り当て)するのに最初は時間がかかります。
  2. MongoDB の監視ツールである MMS を使用して、データベースがボトルネックになっているかどうかを確認します。データベースのロック、ネットワーク使用量、メモリ使用量を確認できます。
  3. MongoDB は、現在のバージョンのデータベース レベルでロックを取得します。そのため、クエリが同じデータベース (単一データベースの異なるまたは同じコレクション) にヒットする場合、操作が遅くなる可能性があります。
  4. また、スレッド数を追加しても、必ずしもパフォーマンスが向上するとは限りません。CPU やメモリ (RAM) などに余分な負荷がかかるため、パフォーマンスが低下する可能性があります。そのため、頻繁に間隔を空けてスレッド数を増やし、パフォーマンスの改善が止まる時期を確認することをお勧めします。

これを行うと、速度が低下している正確な理由がわかるはずです。

乾杯!

于 2015-03-09T04:44:09.263 に答える
0

これは予想される動作だと思います。クエリが実行されるたびに、(勝った) クエリ プランがキャッシュされ、さらに取得できるようになります。

そのクエリキャッシュも何度もダンプされるため、時間がかかる場合があります。

あなたの場合、一部のクエリはコストがかかるようです。それらのクエリを特定し、パフォーマンスを向上させるための対策を講じる必要があると思います。読み取りクエリの場合は、(複合) インデックスが必要になる可能性があります。

書き込みクエリの場合は、さらに分析する必要があります。それはどのような種類のコレクションですか? どのようなインデックスがあり、ドキュメントの数は?

クエリプランのキャッシュの詳細はこちら

于 2016-09-20T17:43:14.847 に答える