Nano Hash - криптовалюты, майнинг, программирование

MongoDB медленно извлекает документы (используется индексация)

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

Мой экземпляр mongoDB-mongod, похоже, слишком много читает по одному запросу. Тестирование на AWS EC2 m4.xlarge с 1 подключенным твердотельным накопителем EBS io 5000Piops (100 ГБ). 16 ГБ ОЗУ.

  • Машина содержит только экземпляр mongodb для целей тестирования.
  • Всего база данных составляет примерно 60 ГБ (на диске) (несколько коллекций).
  • Основные коллекции используются в следующих сценариях и запросах.

статистика БД

db.stats()
{
    "db" : "database",
    "collections" : 4,
    "objects" : 406496932,
    "avgObjSize" : 326.3196544642064,
    "dataSize" : 132647938391,
    "storageSize" : 55475830784,
    "numExtents" : 0,
    "indexes" : 5,
    "indexSize" : 8940408832,
    "ok" : 1
 }

резюме коллекции:

db.collection.stats()  ->  
{    "ns" : "database.[collection###]",
    "count" : 367614513,
    "size" : 121155225858,
    "avgObjSize" : 329,
    "storageSize" : 52052197376,
    "capped" : false,
    "wiredTiger" : {"Left empty"},
    "nindexes" : 2,
    "totalIndexSize" : 8131604480,
    "indexSizes" : {
            "_id_" : 4373012480,
            "id_1_ts_-1" : 3758592000
    },
    "ok" : 1

Запрос:

db.[#######].find({ id : "######", 
   ts : { 
    "$gte" :
       ISODate("2016-10-01T00:00:00.000Z"), 
     $lt :
       ISODate("2016-10-07T02:00:00.000Z")
}}, {_id : 0,"u1"
     :1,"u2":1,"u3":1,"eq1" :1 ,"eq2" : 1,"eq3": 1,"ts" :1});

И результат объяснения:

{
    "queryPlanner" : {
            "plannerVersion" : 1,
            "namespace" : "database.[collection]",
            "d" : false,
            "parsedQuery" : {
                    "$and" : [
                            {
                                    "id" : {
                                            "$eq" : "#####ID#####"
                                    }
                            },
                            {
                                    "ts" : {
                                            "$lt" : ISODate("2016-09-30T22:00:00Z")
                                    }
                            },
                            {
                                    "ts" : {
                                            "$gte" : ISODate("2016-09-22T22:00:00Z")
                                    }
                            }
                    ]
            },
            "winningPlan" : {
                    "stage" : "PROJECTION",
                    "transformBy" : {
                            "_id" : 0,
                            "u1" : 1,
                            "u2" : 1,
                            "u3" : 1,
                            "eq1" : 1,
                            "eq2" : 1,
                            "eq3" : 1,
                            "ts" : 1
                    },
                    "inputStage" : {
                            "stage" : "FETCH",
                            "inputStage" : {
                                    "stage" : "IXSCAN",
                                    "keyPattern" : {
                                            "id" : 1,
                                            "ts" : -1
                                    },
                                    "indexName" : "id_1_ts_-1",
                                    "isMultiKey" : false,
                                    "isUnique" : false,
                                    "isSparse" : false,
                                    "isPartial" : false,
                                    "indexVersion" : 1,
                                    "direction" : "forward",
                                    "indexBounds" : {
                                            "id" : [
                                                    "[\"#####ID#####\", \"#####ID#####\"]"
                                            ],
                                            "ts" : [
                                                    "(new Date(1475272800000), new Date(1474581600000)]"
                                            ]
                                    }
                            }
                    }
            },
            "rejectedPlans" : [ ]
    },
    "executionStats" : {
            "executionSuccess" : true,
            "nReturned" : 676745,
            "executionTimeMillis" : 170508,
            "totalKeysExamined" : 676745,
            "totalDocsExamined" : 676745,
            "executionStages" : {
                    "stage" : "PROJECTION",
                    "nReturned" : 676745,
                    "executionTimeMillisEstimate" : 167820,
                    "works" : 676746,
                    "advanced" : 676745,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 8970,
                    "restoreState" : 8970,
                    "isEOF" : 1,
                    "invalidates" : 0,
                    "transformBy" : {
                            "_id" : 0,
                            "u1" : 1,
                            "u2" : 1,
                            "u3" : 1,
                            "eq1" : 1,
                            "eq2" : 1,
                            "eq3" : 1,
                            "ts" : 1
                    },
                    "inputStage" : {
                            "stage" : "FETCH",
                            "nReturned" : 676745,
                            "executionTimeMillisEstimate" : 166470,
                            "works" : 676746,
                            "advanced" : 676745,
                            "needTime" : 0,
                            "needYield" : 0,
                            "saveState" : 8970,
                            "restoreState" : 8970,
                            "isEOF" : 1,
                            "invalidates" : 0,
                            "docsExamined" : 676745,
                            "alreadyHasObj" : 0,
                            "inputStage" : {
                                    "stage" : "IXSCAN",
                                    "nReturned" : 676745,
                                    "executionTimeMillisEstimate" : 980,
                                    "works" : 676746,
                                    "advanced" : 676745,
                                    "needTime" : 0,
                                    "needYield" : 0,
                                    "saveState" : 8970,
                                    "restoreState" : 8970,
                                    "isEOF" : 1,
                                    "invalidates" : 0,
                                    "keyPattern" : {
                                            "id" : 1,
                                            "ts" : -1
                                    },
                                    "indexName" : "id_1_ts_-                                                                   1",
                                    "isMultiKey" : false,
                                    "isUnique" : false,
                                    "isSparse" : false,
                                    "isPartial" : false,
                                    "indexVersion" : 1,
                                    "direction" : "forward",
                                    "indexBounds" : {
                                            "id" : [
                                                    "[\"#####ID#####\", \"#####ID#####\"]"
                                            ],
                                            "ts" : [
                                                    "(new Date(1475272800000), new Date(1474581600000)]"
                                            ]
                                    },
                                    "keysExamined" : 676745,
                                    "dupsTested" : 0,
                                    "dupsDropped" : 0,
                                    "seenInvalidated" : 0
                            }
                    }
            },
            "allPlansExecution" : [ ]
    },
    "serverInfo" : {
            "host" : "ip #########",
            "port" : 27017,
            "version" : "3.2.10",
            "gitVersion" : "79d9b3ab5ce20f51c272b4411202710a082d0317"
    },
    "ok" : 1

}

Как мы видим выше, mongoDb использует index. IXSCAN занимает 980 мс, а FETCH ~160000 мс.

Если я не ошибаюсь, все чтение должно быть 676746 (nReturned) * 329 (avgObjSize) байт = ~ 212 МБ данных.

Я заметил, что в iostats (http://linuxcommand.org/man_pages/iostat1.html) следующее (/data/db находится в xvdf):

  vg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.27    0.00    0.00   21.35    0.13   78.25
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_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   0.00   0.00
xvdf              0.00     0.00 1691.00    0.00    19.83     0.00    24.02     0.95    0.56    0.56    0.00   0.56  94.40

rMB/s говорит о ~ 20MB/s, и это непрерывно в течение всей операции (стадия выборки). Это означает, что mongodb читает 160 с * 20 МБ/с = 3 200 МБ, что намного больше, чем 200 МБ выше.

Объем памяти:

    free -m
             total       used       free     shared    buffers     cached
   Mem:         16048      12629       3418          0         32       4071
   -/+ buffers/cache:       8525       7522
  Swap:            0          0        

Также mongodb не использует 5000 iops EBS и обещанную пропускную способность? Только с использованием ~ 1700 чтений в секунду, что дает ~ 20 МБ / с.

Я изменил упреждающее чтение на 16 КБ. Я попытался разместить журнал и журнал на другом жестком диске.

Я не могу понять это! Помоги мне. Пожалуйста!


Ответы:


1

Я столкнулся с той же проблемой, когда собирал около 35000 документов. Чтобы решить эту проблему, я использовал агрегатную функцию (sakulstra:aggregate), и в моем случае она невероятно увеличила запрос. Формат результата, очевидно, отличается, но его по-прежнему легко использовать для вычисления всего, что мне нужно.

До (7000 мс):

const historicalAssetAttributes = HistoricalAssetAttributes.find({
        date:{'$gte':startDate,'$lte':endDate},
        assetId: {$in: assetIds}
    }, {
        fields:{
            "date":1,
            "assetId":1,
            "close":1
        }
    }).fetch();

После (300 мс):

const historicalAssetAttributes = HistoricalAssetAttributes.aggregate([
        {
            '$match': {
                date: {'$gte': startDate, '$lte': endDate},
                assetId: {$in: assetIds}
            }
        }, {
            '$group':{
                _id: {assetId: "$assetId"},
                close: {
                    '$push': {
                        date: "$date",
                        value: "$close"
                    }
                }
            }
        }
    ]);
28.06.2019

2

Основные факты:

  • Машина имеет 16 ГБ оперативной памяти
  • Рассматриваемая коллекция имеет размер 112 ГБ без сжатия (~ 51 ГБ со сжатием).
  • Общий размер индекса коллекции составляет ~7 ГБ.
  • Коллекция содержит 367 614 513 документов.
  • Основная часть времени уходит на получение документов для проецирования. Это занимает 166470 мс (~166 секунд). Сканирование индекса для запроса занимает всего 980 мс (‹1 секунды).

Предполагая, что кэш WiredTiger установлен по умолчанию, объем оперативной памяти, зарезервированной для кэша WiredTiger, должен составлять приблизительно 8,6 ГБ. В https://docs.mongodb.com/v3.2/faq/storage/#to-what-size-should-i-set-the-wiredtiger-internal-cache:

Начиная с MongoDB 3.2, внутренний кеш WiredTiger по умолчанию будет использовать большее из следующих значений:

  • 60% оперативной памяти минус 1 ГБ или
  • 1 GB.

Из приведенной выше информации следует, что на вашем компьютере существует нехватка памяти. MongoDB пытается хранить индексы в памяти для быстрого доступа, и весь индекс составляет ~7 ГБ. Это фактически заполнит ~ 80% вашего кеша WiredTiger только индексом, оставив мало места для чего-либо еще. В результате MongoDB вынуждена извлекать документы результирующего набора с диска. В этот момент производительность страдает.

Вы можете увидеть эффект от этого на выходе iostat, где устройство xvdf (где находятся данные) использует более 94% (показано в столбце %util), что означает, что ваша операция связана с вводом-выводом, как вы этого не делаете. У вас достаточно оперативной памяти, чтобы удовлетворить ваш идеальный рабочий набор.

Чтобы смягчить эту проблему, вы можете попробовать:

  • Предоставьте больший объем ОЗУ для вашего развертывания
  • Если применимо, используйте курсор для возврата документов вместо того, чтобы пытаться сразу получить доступ ко всему набору результатов.

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

31.10.2016
  • Привет! Я пытался использовать r3.xlarge (30,5 ГБ оперативной памяти). Но чтение с диска все еще слишком много. Из iostat rKB/s ~ 60000KB/s и 20s я получаю примерно 1,2 ГБ данных, считанных с диска (должно быть намного меньше, ~0,2 ГБ). Я попытался разделить запрос на отдельные курсоры, и это немного ускорило его. Есть ли что-то еще, что я могу сделать, чтобы выяснить узкое место этой проблемы с производительностью? 31.10.2016
  • Трудно сказать без глубоких знаний вашего варианта использования и развертывания, тем более что настройка базы данных — это глубокая тема. Я не думаю, что смотреть на rKB/s — хороший показатель. util% лучше отражает насыщенность вашего диска. Также обратите внимание на столбец mongostat, особенно на столбец %used, который показывает использование кэша WiredTiger. На данный момент все данные указывают на то, что причиной является нехватка оперативной памяти (т. е. ваш рабочий набор слишком велик для имеющегося у вас объема оперативной памяти). 01.11.2016
  • Привет, увеличив объем оперативной памяти, я заставил его работать немного лучше. Спасибо за ваш ответ. 04.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..