Подтвердить что ты не робот

Как улучшить производительность вставки MongoDB

Результат:

Если вы работаете с набором данных, который является отказоустойчивым, или выполняющим одноразовый процесс, вы можете подтвердить, что может помочь изменение WriteAcknowledge to Unrevedledged.

Кроме того, массовые операции IsOrdered по умолчанию, которые я не знал. Установка этого параметра в False фактически делает операцию выполняемой массой, в противном случае она работает как один поток обновлений.


Драйвер MongoDB 3.0/WiredTiger/С#

У меня есть коллекция с 147 000 000 документов, из которых я выполняю обновления каждую секунду (надеюсь) около ок. 3000 документов.

Вот пример обновления:

"query" : {
    "_id" : BinData(0,"UKnZwG54kOpT4q9CVWbf4zvdU223lrE5w/uIzXZcObQiAAAA")
},
"updateobj" : {
    "$set" : {
        "b" : BinData(0,"D8u1Sk/fDES4IkipZzme7j2qJ4oWjlT3hvLiAilcIhU="),
        "s" : true
    }
}

Это типичное обновление, в котором я должен вставлять мои требования со скоростью 3000 в секунду.

К сожалению, они занимают в два раза больше, например последнее обновление было для 1723 документов и заняло 1061 мс.

В коллекции только есть индекс на _id, нет других индексов, а средний размер документа для коллекции - 244 байта, не отображается.

Сервер имеет 64 ГБ памяти, 12 потоков. Вставка производительности превосходна с меньшими размерами коллекции, скажем, около 50 миллионов, но после того, как около 80 миллионов действительно начинают падать.

Может быть, потому, что весь набор не сидит в памяти? База данных поддерживается SSD RAID0, поэтому производительность IO не должна стать узким местом, и если бы это было, это должно было показать это в начале?

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

В любом случае текущая скорость вставки недостаточно хороша.

Обновление: вот объяснение() только запроса...

"queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "Collection",
    "indexFilterSet" : false,
    "parsedQuery" : {
        "_id" : {
            "$eq" : { "$binary" : "SxHHwTMEaOmSc9dD4ng/7ILty0Zu0qX38V81osVqWkAAAAAA", "$type" : "00" }
        }
    },
    "winningPlan" : {
        "stage" : "IDHACK"
    },
    "rejectedPlans" : []
},
"executionStats" : {
    "executionSuccess" : true,
    "nReturned" : 1,
    "executionTimeMillis" : 1,
    "totalKeysExamined" : 1,
    "totalDocsExamined" : 1,
    "executionStages" : {
        "stage" : "IDHACK",
        "nReturned" : 1,
        "executionTimeMillisEstimate" : 0,
        "works" : 2,
        "advanced" : 1,
        "needTime" : 0,
        "needFetch" : 0,
        "saveState" : 0,
        "restoreState" : 0,
        "isEOF" : 1,
        "invalidates" : 0,
        "keysExamined" : 1,
        "docsExamined" : 1
    },
    "allPlansExecution" : []
},

Запрос сам по себе очень быстрый, и операция обновления занимает около 25 миллисекунд, их толкают в Mongo с помощью BulkWriter: await m_Collection.BulkWriteAsync(updates);

4b9b3361

Ответ 1

Вы можете попытаться изменить уровень сообщений о проблемах. Очевидно, что на этом риск, так как вы не сможете поймать какую-либо ошибку при записи, но по крайней мере вы все равно сможете захватить сетевые ошибки. Поскольку MongoDB группирует операции объемной вставки в группы из 1000, это должно ускорить процесс.

W по умолчанию: 1:

enter image description here

Когда вы меняете его на 0:

enter image description here

Если вы не беспокоитесь о порядке элементов, вы можете получить некоторую скорость, вызвав неупорядоченную объемную операцию

await m_Collection.BulkWriteAsync(updates, new BulkWriteOptions() { IsOrdered = false });

С помощью списка неупорядоченных операций MongoDB может выполнять параллельно записывать операции в списке и в любом порядке. Ссылка

Ответ 2

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

Обновление включает чтение. aka, чтобы найти, что оставлено _id - возможно, возможно, что осколки могут оказаться полезными, если не v полезно

Ответ 3

Мы перешли на Кассандру, потому что Монго не очень хорошо масштабируется. Если вы скажете, что после 80M вы видели ухудшение производительности, легко это связано с памятью. Я больше разбираюсь в SQL DB, но я бы не сказал, что 25ms для не-ключевого обновления поля впечатляет. Я подозреваю, что подобное обновление будет лучше работать на Oracle, MySql,...