Почему MongoDB работает лучше с многопоточным клиентом по сравнению с однопоточным клиентом? - PullRequest
6 голосов
/ 01 июля 2011

Недавно мы протестировали Oracle 10g и MongoDB с YCSB (https://github.com/brianfrankcooper/YCSB/wiki), когда мы попытались увеличить количество потоков для 1 000 000 наборов данных, производительность Oracle оставалась постоянной после 4 потоков, однако MongoDB продолжала работать лучше и лучше до8 потоков и после этого только чтение было лучше, записи и обновления (операций / сек) оставались постоянными.

Мы провели этот тест на двухъядерном процессоре Xeon с 2 процессорами (всего 8 ядер) + 8 ГБ ОЗУ в локальной сети.

Мы обнаружили, что MongoDB работал лучше с многопоточным клиентом по сравнению с однопоточнымклиент, мой вопрос: когда MongoDB может работать лучше с большей нагрузкой, почему он не может сделать то же самое с меньшей нагрузкой (скажем, всего несколько потоков), используя несколько ядер?

Ответы [ 2 ]

6 голосов
/ 01 июля 2011

Логически очень просто обработать запрос на одном ядре.Просто имейте код, который получает запрос и обрабатывает его.

Не так просто обработать один запрос на 2 ядра, потому что для этого необходимо разбить запрос на компоненты, разбить фермуработать, синхронизировать ответы, а затем создать единый ответ.И если вы выполняете эту работу, в то время как вы можете сократить время настенных часов (сколько времени часы на стене видят), вы неизменно будете заставлять запрос занимать больше процессорного времени (общее потребление ресурсов CPU).

В такой системе, как MongoDB, где вы ожидаете, что множество разных клиентов делают запросы, нет необходимости пытаться распараллелить обработку одного запроса, и нет никаких причин для этого.

Более важный вопросВот почему Oracle не увеличил параллелизм после 4 процессоров.Существует множество возможных причин, но одно разумное предположение состоит в том, что вы столкнулись с некоторой блокировкой, которая необходима для обеспечения согласованности.(MongoDB не предлагает вам согласованности и поэтому избегает такого типа узких мест.)

3 голосов
/ 01 июля 2011

Oracle не блокирует данные для согласованности, но записывает данные для повторения и отмены файлов для транзакций и согласованности чтения. Oracle - это система MVCC. См. http://en.wikipedia.org/wiki/Multiversion_concurrency_control.

Вы должны использовать параметризованные запросы, чтобы ускорить работу Oracle, иначе Oracle будет тратить слишком много времени на анализ запросов. Это особенно важно, когда одновременно выполняется множество небольших запросов, которые вы тестируете.

MongoDB блокирует запись.

изменить 1:

Еще одно большое различие между Oracle и MongoDB - это долговечность. MongoDB не обеспечивает долговечность, если вы используете конфигурацию по умолчанию. Он записывает данные каждую минуту на диск. Oracle записывает на диск каждый коммит. Так что Oracle делает намного больше фсинсинга.

...