Назад | Перейти на главную страницу

Хранилище MongoDB WiredTiger не использует два ядра ЦП

Как заявлено в описании механизма хранения WiredTiger, он обеспечивает возможность лучшего параллелизма за счет блокировки на уровне документа. Из эта почта:

WiredTiger масштабируется на современных многопроцессорных архитектурах. Используя различные методы программирования, такие как указатели опасности, алгоритмы блокировки, быстрая фиксация и передача сообщений, WiredTiger выполняет больше работы на ядро ​​ЦП, чем альтернативные механизмы.

По какой-то причине моему варианту использования это не приносит пользы. У меня есть база данных с множеством одновременных записей (в основном обновлений), и такая нагрузка не может преодолеть ограничение в 2000 обновлений в секунду. Здесь mongostat 10 вывод:

insert query update delete getmore command % dirty % used flushes  vsize    res qr|qw ar|aw netIn netOut conn     time
     3   780   1936    141      42     3|0     0.3    1.0       0 717.0M 289.0M   0|0   1|0  433k     6m  141 17:16:32

Пропускная способность диска не насыщена, iostat -x 10 вывод:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          20.56    0.00   20.31    0.10    0.10   58.93

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvda              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvdb              0.00     5.80    0.00  102.50     0.00  6188.80    60.38     3.46   33.79   0.46   4.72

Учитывая все это, я предполагаю, что узким местом является использование ЦП, которое всегда стабильно на 100% все время для mongod процесс в top (от суммы 200%, что означает, что используется только один ЦП из двух). 58% простой с iostat также подтверждает это.

Существуют ли какие-либо методы, чтобы определить, использует ли хранилище WiredTiger блокировку на уровне документа и два ядра ЦП одновременно, как и должно быть? Или это могло произойти по каким-либо причинам, кроме ограничения мощности процессора?

Операции записи выполняются последовательно на одноядерном экземпляре. Операции чтения имеют параллелизм. Это то, что я понял из своих чтений.

Какая у вас установка клиента mongodb и какое оборудование?

По моему опыту тестирования различных механизмов хранения mongodb в разных системах, один экземпляр mongodb может довольно быстро попасть в стену при выполнении операций в секунду.

Это может быть из-за множества причин, таких как узкое место в полосе пропускания или время отправки. Чтобы узнать, пришло ли время отправки, вы можете попробовать запустить два экземпляра mongod бок о бок. Если оба они достигают 2000 обновлений в секунду и используют по 1 ЦП каждый, то вполне возможно, что время, необходимое mongod для отправки команд обновления, больше, чем время, необходимое вашей системе для выполнения некоторых команд обновления. Следовательно, у mongod не было бы причин использовать другое ядро ​​процессора, потому что первое всегда готово к следующему обновлению (даже если оно находится на пределе).

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

Если вы хотите использовать top, если mongoDB является основной загрузкой ЦП, вы должны иметь возможность использовать 1 вариант, (нажмите 1 после top запускается) или используйте альтернативный метод, как описано здесь: Как измерить использование отдельных ядер ЦП для процесса?

Для инструментов mongo это зависит от версии (инструменты изменены с 2.x на 3.x, поэтому использование инструментов для просмотра информации о блокировке будет зависеть от вашей версии), но db.serverStatus() должен предоставить вам информацию, которую вы ищете. Видеть Как мне увидеть статус блокировок на моих экземплярах mongod? для получения более подробной информации о конкретной версии. Не забудьте убедиться, что используемая вами версия MongoDB совпадает с версией в верхнем левом углу страницы (щелкните номер версии, чтобы изменить версию документации, которую вы просматриваете).