MongoDB дает непоследовательное время записи

Я использую Scala, Reactive Mongo 0.10.5 и Mongo 2.6.4, работающие на Ubuntu. Я тестировал несколько конфигураций компьютеров, но сейчас я работаю с 15 ГБ памяти, 2 ядрами и 60 ГБ хранилища SSD (AWS).

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

Я пишу постоянный объем данных, используя 10 отдельных потоков в одну коллекцию. Каждая запись состоит из документа, содержащего массив из 1000 элементов. Каждый элемент представляет собой сложный документ, состоящий из нескольких полей и вложенных полей. Я тестировал массивы 1000, 10000 и 100 и наблюдал одинаковое поведение со всеми. Каждая запись уникальна (т.е. я никогда не пишу в один и тот же документ дважды)

Скорость записи, как правило, составляет около 100-200 мс на запись с текущим оборудованием, которое я использую. Я хотел бы лучше, но это не моя главная проблема.

Моя главная проблема заключается в том, что иногда время записи увеличивается. Когда они это сделают, для завершения одной записи может потребоваться несколько секунд. В конце концов они завершаются, но это занимает некоторое время. У меня есть тайм-ауты, встроенные в приложение, выполняющее запись (10 секунд), и когда случаются всплески, оно часто достигает этого тайм-аута. Я увеличил время ожидания и убедился, что запись в конечном итоге завершается, но это может занять много времени (более 30 секунд).

Я работал с Mongo до использования Java-драйвера Mongo в Scala и не замечал этой проблемы. Однако неясно, является ли проблема результатом драйвера или моей настройки Mongo.

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

Я запускал mongostat во время работы, и кажется, что когда запись начинается долго, я замечаю аналогичное замедление в mongostat. т.е. mongostat сделает паузу на несколько секунд, прежде чем продолжить.

Сама машина монго скучает, пока это происходит. Средние нагрузки минимальны, равно как и использование ЦП и памяти. В своп вроде не идет.

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

Кто-нибудь видел такое поведение раньше? Это что-то в моей конфигурации или, возможно, что-то с драйвером Reactive Mongo?

ОБНОВИТЬ:

Используя iostat, я смог определить, что нормальная скорость записи в секунду составляет около 1 МБ/с. Однако в медленные периоды она достигает 6-7 МБ/с.

Я также нашел следующее в журналах монго.

[DataFileSync] сброс mmaps занял 15621 мс для 35 файлов

[DataFileSync] сброс mmaps занял 14816 мс для 22 файлов

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

Судя по этим наблюдениям, это определенно проблема очистки диска.

Означает ли это, что я отправляю больше данных, чем может обработать текущая конфигурация Mongo? Или есть какая-то другая конфигурация, которая может уменьшить влияние этих сбросов?


person Wade    schedule 18.08.2014    source источник
comment
Есть ли вероятность того, что ваши замедления вызваны сбросом на диск? Почему бы вам не добавить свои настройки в MongoDB MMS и не посмотреть на все графики, которые он вам предоставляет, включая время фонового сброса.   -  person alernerdev    schedule 19.08.2014
comment
Взгляните на ввод-вывод с помощью iostat или чего-то подобного. Какова конфигурация вашего драйвера (включая настройку ведения журнала)?   -  person xeraa    schedule 19.08.2014
comment
Это может быть вызвано сбросом на диск. Но ожидается ли такое резкое замедление при таком флеше? Можно ли как-то сгладить? т.е. можно ли делать сброс чаще, чтобы каждый отдельный сброс имел меньшее влияние? Переход от нескольких сотен миллисекунд к нескольким секундам является довольно большим ударом по производительности.   -  person Wade    schedule 19.08.2014
comment
Из вашего обновления кажется очевидным, что проблема заключается в том, что диск переполняет диск. Попробуйте просмотреть производственные примечания и примечания по конфигурации для EC2, чтобы узнать, есть ли там какие-либо полезные советы. Например, настройки упреждающего чтения по умолчанию не установлены оптимально для MongoDB.   -  person wdberkeley    schedule 19.08.2014
comment
Я изменил настройки упреждающего чтения, а также установил флаг noatime для дисков. Эти настройки, похоже, не имеют заметного значения.   -  person Wade    schedule 20.08.2014
comment
Хотя я специально не исправил это, я несколько облегчил симптомы, переместив файлы журнала на отдельный диск и уменьшив размер записываемых данных.   -  person Wade    schedule 26.08.2014


Ответы (1)


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

Честно говоря, я не знаю, почему блокировка потока привела к наблюдаемому поведению в Mongo, но если проблема исчезнет, ​​я не буду жаловаться.

person Wade    schedule 16.04.2015