7

最近、Oracle 10g と MongoDB を YCSB ( https://github.com/brianfrankcooper/YCSB/wiki ) でベンチマークしました。1,000,000 データセットのスレッド数を増やそうとしたところ、Oracle のパフォーマンスは 4 スレッド後も一定でしたが、MongoDB はパフォーマンスを維持しました。 8 スレッドまではどんどん良くなり、その後は読み取りのみが良くなり、書き込みと更新 (操作/秒) は一定のままでした。

このベンチマークは、LAN 上の 2 CPU Xeon クアッド コア (合計 8​​ コア) + 8 GB RAM で実行しました。

私たちが観察したことは、シングルスレッド クライアントと比較して、マルチスレッド クライアントで MongoDB のパフォーマンスが優れていることでした。私の質問は、MongoDB はより多くの負荷でパフォーマンスが向上するのに、なぜ少ない負荷で同じことを実行できないのかということです (たとえば、ほんの数スレッド) )複数のコアを利用して?

4

2 に答える 2

8

シングルコアでリクエストを処理するのは論理的に非常に簡単です。リクエストを受け取り、それを処理するコードを用意するだけです。

1 つのリクエストを 2 つのコアで処理するのはそれほど単純ではありません。そのためには、リクエストをコンポーネントに分割し、作業をファームアウトし、回答を同期させてから、1 つのレスポンスを構築する必要があるためです。そして、この作業を行うと、壁時計の時間 (壁の時計が通過する時間) を減らすことができますが、リクエストにかかる CPU 時間 (消費される合計 CPU リソース) は常に長くなります。

多くの異なるクライアントがリクエストを行うことが予想される MongoDB のようなシステムでは、単一のリクエストの処理を並列化しようとする必要はありません。

より大きな問題は、Oracle が 4 つの CPU の後で同時実行性を増やさなかった理由です。考えられる理由はいくつもありますが、合理的な推測の 1 つは、一貫性を保証するために必要な何らかのロックが発生したことです。(MongoDB は一貫性を提供しないため、このタイプのボトルネックを回避します。)

于 2011-07-01T06:06:33.597 に答える
3

Oracle は一貫性のためにデータをロックしませんが、トランザクションと読み取りの一貫性のために REDO ファイルと UNDO ファイルにデータを書き込みます。Oracle は MVCC システムです。http://en.wikipedia.org/wiki/Multiversion_concurrency_controlを参照してください。

パラメータ化されたクエリを使用して Oracle を高速化する必要があります。そうしないと、Oracle がクエリの解析に多くの時間を費やすことになります。これは、テストしている状況のように、多数の小さなクエリが同時に実行される場合に特に重要です。

MongoDB は書き込み時にロックします。

編集1:

Oracle と MongoDB のもう 1 つの大きな違いは耐久性です。既定の構成を使用する場合、MongoDB は持続性を提供しません。毎分 1 回、データをディスクに書き込みます。Oracle はコミットごとにディスクに書き込みます。そのため、Oracle はより多くの fsync を実行します。

于 2011-07-01T10:58:32.063 に答える