2013-10-09 3 views
2

После запуска Mongo через mongod, я выполнил запрос Mongo, который принял секунд. Вызов db.serverStatus() на моем «админ» db показал, что Mongo имеет resident память объемом 1 ГБ. Документы объясняют, что «резидентная» память представляет собой объем физического диска/оперативной памяти, который использует Mongo.Состояние сервера Mongo - память «Resident»

Затем, я повторил тот же запрос, но потребовалось секунд. Глядя на память resident, я увидел 5 ГБ.

Большое увеличение объема оперативной памяти, я считаю, помогает объяснить, почему время запроса сократилось с 300 до 8 секунд, но почему резидентная память так быстро прыгает?

Есть ли какой-то тип «прогрева», который рекомендуется подготовить к Монго, чтобы избежать 300-секундных запросов?

ответ

4

Существует причина, по которой MongoDB использует функциональность mmap операционной системы. Это означает, по крайней мере, в системах Linux. Управление памятью mongodb основано на некоторой функциональности операционной системы, называемой файлами с отображением памяти. Память в системах Linux адресована на нескольких уровнях, в основном любая программа увидит адресное пространство на 32-битных системах объемом 2 ГБ по всем, на 64-битных системах 128TB. Это виртуальное адресное пространство, которое означает, что на 32/64-битной памяти объем памяти может быть адресован с 4-килобайтными страницами памяти (страница - это отдельная часть памяти). Вот почему, если вы запустите mongoDB в 32-битной системе, то появится предупреждение о том, что база данных на такой системе может обрабатывать только 2 ГБ данных. Очевидно, что это виртуальное адресное пространство больше, чем количество физической памяти, поэтому существует сопоставление между этими виртуальными адресами и физическими. Некоторые виртуальные адреса находятся в реальной физической памяти, поэтому они находятся в реальной памяти, но алгоритм, обеспечивающий это на стороне ядра. Программы, работающие в системах Linux, могут работать только с виртуальными адресами, если вы пытаетесь получить доступ к адресу виртуальной памяти, который не находится в физической памяти, возникает ошибка страницы (вы можете отслеживать это в дополнительном информационном поле serverStatus). (Вы можете найти краткое объяснение этого here)

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

Существует команда в MongoDB, который с вы можете применять кэширование коллекции или индекс этой команды является touch Если вы используете эту команду, чтобы загрузить данные в память перед в первом запросе вы получите результаты в 8 секунд при первой попытке. К сожалению, вы не можете заставить ОС постоянно сохранять это в памяти, поэтому, если у вас есть другие вещи, использующие память, OS выведет эти данные через некоторое время.

Если у вас достаточно физической памяти, mongoDB будет хранить все данные и индексы в памяти. Это не всегда необходимо. Существует часть данных, которые должны быть в памяти, чтобы избежать большого количества ошибок страницы, это workingset. Вы можете проверить размер рабочего набора с помощью команды db.runCommand({ serverStatus: 1, workingSet: 1 }).

Вы не можете обрабатывать пейджинг, пока он находится на уровне ОС, но если у вас достаточно памяти, ядро ​​любит хранить как можно больше файлов. Если рабочая область подходит в памяти, вы более или менее ок. Если некоторые документы действительно редко доступны, и недостаточно памяти, чтобы хранить все там, они будут выгружены в любом случае.

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

+0

Благодарим за полезный ответ. Итак, если у меня достаточно памяти в памяти, чтобы покрывать только индексы, ошибки страницы могут возникать при извлечении неиндексированных полей из найденных документов? –

+0

Проблема состоит из нескольких уровней. Вы можете проверить размер рабочего набора, который я обновляю в ближайшее время. – attish

+0

Я обновил часть, связанную с работой. Я рад, что может вам помочь. – attish

Смежные вопросы