Я не эксперт в управлении памятью 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 (если база данных завершена правильно, файлы журнала удаляются и снова перераспределяются при запуске).