Существует причина, по которой 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.
Благодарим за полезный ответ. Итак, если у меня достаточно памяти в памяти, чтобы покрывать только индексы, ошибки страницы могут возникать при извлечении неиндексированных полей из найденных документов? –
Проблема состоит из нескольких уровней. Вы можете проверить размер рабочего набора, который я обновляю в ближайшее время. – attish
Я обновил часть, связанную с работой. Я рад, что может вам помочь. – attish