Я использую 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? Или есть какая-то другая конфигурация, которая может уменьшить влияние этих сбросов?