Назад | Перейти на главную страницу

MongoDB: большой размер отображаемой памяти

Я не эксперт в управлении памятью mongo, но некоторые вещи меня смущают. Я использую Mongo 2.4.9, и у меня есть наборы реплик для трех узлов. Я выполнил db.serverStatus (). Mem и вижу, что размер сопоставленного файла очень велик, 47 ГБ:

db.serverStatus().mem
{
        "bits" : 64,
        "resident" : 266,
        "virtual" : 101491,
        "supported" : true,
        "mapped" : 47402,
        "mappedWithJournal" : 65730
}

Результат db.stats (1024)

{
        "db" : "xxxxx",
        "collections" : 7,
        "objects" : 670488,
        "avgObjSize" : 2890.6140721385023,
        "dataSize" : 1892697,
        "storageSize" : 2273304,
        "numExtents" : 49,
        "indexes" : 42,
        "indexSize" : 399378,
        "fileSize" : 10416128,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "ok" : 1
}

В мегабайтах

"dataSize" : 1848mb
"storageSize" : 2220mb
"fileSize" : 10172mb

Информация о рабочем наборе:

"workingSet" : {
         "note" : "thisIsAnEstimate",
         "pagesInMemory" : 152599,
         "computationTimeMicros" : 31143,
         "overSeconds" : 1728
 }

Размер (Мб) = 152599 * 4кб -> конвертировать в Мб = 596 Мб

У меня вопрос: почему размер отображаемой памяти в 4,2 раза больше, чем fileSize, и в 15159 раз больше, чем storageSize или dataSize? Отображенная память продолжает медленно расти. Недели две назад было около 32гб.

Примечание:

OS: Red Hat Enterprise Linux Server release 5.7 (Tikanga)
Physical memory: 3892Mb

Я читал это статья но до сих пор не понимаю, почему размер отображаемой памяти такой большой с учетом достаточно малого размера реальных данных (размер файла).

Спасибо.

Отображенная фигура, которую вы перечисляете из db.serverStatus() вывод - это в основном измерение всех файлов данных, которые были отображены в память с использованием mmap. Последующие перечисленные вами команды предназначены либо для одной базы данных (db.stats()), и это не будет эквивалентным для всех баз данных, если вы не запустите его во всех базах данных и не сложите цифры вместе. Или они измеряют что-то совершенно другое (рабочий набор), который будет сильно зависеть от того, что вы делали с базой данных в последнее время, и не будет превышать вашу физическую память.

Что касается баз данных, ни один набор реплик - это только одна база данных, всегда есть локальная БД, которая содержит журнал операций для репликации и который (как минимум) будет включен в сопоставленный рисунок, как и любое пустое пространство, используемое для предварительного выделения .

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