MongoDB производит более 100% накладных расходов на хранение?т.е. я вставляю 22ГБ данных и они занимают 50ГБ на диске - PullRequest
1 голос
/ 26 января 2012

Я провел простой эксперимент для проверки производительности MongoDB и использования диска. Я вставляю 22 ГБ данных, но они занимают 50 ГБ на диске. Я опишу этот эксперимент более подробно, как показано ниже.

Установка:

  • Версия - MongoDB 2.0.2.
  • Среда: 1) Один узел без какой-либо репликации или шардинга. 2) ВМ через VirtualBox. 3) Linux Ubuntu 64bit. 4) 100 ГБ фиксированного виртуального диска и 1 ГБ памяти
  • Язык: C # && MongoDB C # драйвер
  • Цель и порядок действий: очень просто. Я просто постоянно создаю новую пару {KEY, VALUE} и вставляю ее в MongoDB.
  • * Количество вставок = 1024 *1024* 1024/3
  • Размер KEY = 20 байтов (байтовый массив), счетчик с шагом 1 для каждой вставки, т.е. KEY = {1, 2, 3, ..., 1024 *1024* 1024}
  • Размер VALUE = 100 байт (байтовый массив), случайным образом сгенерированный с помощью класса Random.

Результаты:

Итак, этот эксперимент означает, что я хотел вставить около 40 ГБ данных (120 байтов данных для каждой вставки) в MongoDB, и я считаю, что это достаточно просто. Однако я остановился, когда фактические вставленные данные достигли 22 ГБ, потому что я обнаружил проблему с нехваткой памяти. Фактические данные, которые я вставил, составляют около 22 ГБ, но все файлы indexdb. * Имеют размер 50 ГБ. Таким образом, затраты на хранение превышают 100%.

Мои мысли:

Я прочитал довольно много документов MongoDB. Согласно тому, что я прочитал, может быть два вида накладных расходов на хранилище.

  1. Оплог. Но предполагается, что он занимает около 5% дискового пространства. В моем случае это около 5 ГБ.
  2. предварительно выделенный файл данных. Я не изменил никаких настроек mongod, поэтому думаю, что это 2 ГБ заранее. И позвольте мне предположить, что последний используемый файл на 2 ГБ почти пуст, так что не более 4 ГБ.

Таким образом, исходя из моих вычислений, независимо от того, какой размер данных я вставляю, максимальные накладные расходы должны составлять 9 ГБ. Но теперь накладные расходы составляют 50 ГБ - 22 ГБ = 28 ГБ. И я не понимаю, что находится внутри этих 28 ГБ. И если эти накладные расходы всегда превышают 100%, это довольно много.

Может кто-нибудь объяснить, пожалуйста, мне?


Вот некоторые характеристики mongodb, которые я получил из оболочки mongo.

db.serverStatus() {
"host" : "mongodb-VirtualBox",
"version" : "2.0.2",
"process" : "mongod",
"uptime" : 531693,
"uptimeEstimate" : 460787,
"localTime" : ISODate("2012-01-26T16:32:12.888Z"),
"globalLock" : {
     "totalTime" : 531692893756,
     "lockTime" : 454374529354,
     "ratio" : 0.8545807827977436,
     "currentQueue" : {
          "total" : 0,
          "readers" : 0,
          "writers" : 0
     },
     "activeClients" : {
          "total" : 0,
          "readers" : 0,
          "writers" : 0
     }
},
"mem" : {
     "bits" : 64,
     "resident" : 292,
     "virtual" : 98427,
     "supported" : true,
     "mapped" : 49081,
     "mappedWithJournal" : 98162
},
"connections" : {
     "current" : 3,
     "available" : 816
},
"extra_info" : {
     "note" : "fields vary by platform",
     "heap_usage_bytes" : 545216,
     "page_faults" : 14477174
},
"indexCounters" : {
     "btree" : {
          "accesses" : 3808733,
          "hits" : 3808733,
          "misses" : 0,
          "resets" : 0,
          "missRatio" : 0
     }
},
"backgroundFlushing" : {
     "flushes" : 8861,
     "total_ms" : 26121675,
     "average_ms" : 2947.93759169394,
     "last_ms" : 119,
     "last_finished" : ISODate("2012-01-26T16:32:03.825Z")
},
"cursors" : {
     "totalOpen" : 0,
     "clientCursors_size" : 0,
     "timedOut" : 0
},
"network" : {
     "bytesIn" : 44318669115,
     "bytesOut" : 50995599,
     "numRequests" : 201846471
},
"opcounters" : {
     "insert" : 0,
     "query" : 3,
     "update" : 201294849,
     "delete" : 0,
     "getmore" : 0,
     "command" : 551619
},
"asserts" : {
     "regular" : 0,
     "warning" : 0,
     "msg" : 0,
     "user" : 1,
     "rollovers" : 0
},
"writeBacksQueued" : false,
"dur" : {
     "commits" : 28,
     "journaledMB" : 0,
     "writeToDataFilesMB" : 0,
     "compression" : 0,
     "commitsInWriteLock" : 0,
     "earlyCommits" : 0,
     "timeMs" : {
          "dt" : 3062,
          "prepLogBuffer" : 0,
          "writeToJournal" : 0,
          "writeToDataFiles" : 0,
          "remapPrivateView" : 0
     }
},
"ok" : 1}

db.index.dataSize (): 29791637704

db.index.storageSize (): 33859297120

db.index.totalSize (): 45272200048

db.index.totalIndexSize (): 11412902928

db.runCommand ("getCmdLineOpts"): {"argv": ["./mongod"], "parsed": {}, "ok": 1}


Мой фрагмент кода. Я просто удалил эти коды подключения MongoDB и сохранил здесь ядра.

static void fillupDb()
{
    for (double i = 0; i < 1024 * 1024 * 1024 / 3; i++)
    {
        //Convert the counter i to a 20 bytes of array as KEY
        byte[] prekey = BitConverter.GetBytes(i);
        byte[] key = new byte[20];
        prekey.CopyTo(key, 0);

        // Generate a random 100 bytes of VALUE
        byte[] value = getRandomBytes(100);
        put(key, value);
    }
}

public void put(byte[] key, byte[] value)
{
    BsonDocument pair = new BsonDocument {
        { "_id", key } /* I am using _id as the index */,
        { "value", value }};
    collection.Save(pair);
}

1 Ответ

4 голосов
/ 26 января 2012

Ну, во-первых.Как вы измеряете размер ваших входных данных?Пара ключ-значение может быть двумя строками или объектом JSON.

Кроме того, к каждому документу добавлены некоторые дополнительные отступы для облегчения его роста при последующих обновлениях.Средний коэффициент заполнения можно получить с помощью db.col.stats (). PaddingFactor

Наконец, есть не только оплог, который может добавить к вашим накладным расходам.На _id всегда есть индекс, который в вашем случае (так как ваш документ очень маленький) привнесет значительные издержки с точки зрения использования дискового пространства.Если вы не отключили его (--nojournal), журнал также добавит к итогу немало байтов.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...