Я провел простой эксперимент для проверки производительности 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. Согласно тому, что я прочитал, может быть два вида накладных расходов на хранилище.
- Оплог. Но предполагается, что он занимает около 5% дискового пространства. В моем случае это около 5 ГБ.
- предварительно выделенный файл данных. Я не изменил никаких настроек 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);
}