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

Не отображенная виртуальная память mongod внезапно удвоилась, не изменилась с тех пор

В non-mapped virtual memory stat для наших праймериз монго всегда был постоянным, и мы никогда не задумывались об этом до вчерашнего дня. Вчера серия случайных сканирований полной коллекции из плохо разработанного запроса привела к значительному замедлению, когда mongod процесс использовал 100% ЦП, и каждый запрос занимал десятки секунд.

После передачи ошибочного запроса нашим вторичным серверам проблемы с производительностью исчезли, но не отображенная виртуальная память увеличилась более чем вдвое и с тех пор не снижалась. Раньше он держался около 600MB; теперь это примерно 1.4GB. Рост был мгновенным и точно коррелирует с замедлением, и с тех пор он вообще не изменился.

Количество подключений было полностью постоянным, поэтому мы можем быть уверены, что это не так.

Что могло вызвать это? Это проблема? Стоит ли нам беспокоиться?

Работает в 64-разрядной версии Ubuntu 12.04 на экземпляре EC2.

Ответ это зависит но это не кажется проблемой, и вам не следует слишком беспокоиться, если это единственное поведение, которое вы видели.

Уровень хранения в MongoDB использует файлы с отображением памяти, поэтому общая используемая виртуальная память может быть размером всех ваших данных БД на диске.

Резидентная память в системе будет представлять фактический рабочий набор, используемый MongoDB, и, в зависимости от ваших шаблонов использования / доступа, она обычно со временем вырастет до общей физической памяти на вашем хосте. ОС будет выгружать эти данные только тогда, когда видит необходимость, в противном случае они просто останутся на месте (для данных используется подход «Наименее недавно использованные / LRU» и «Наименее часто используемые / LFR»). Использование виртуальной памяти будет расти вместе с этим чуть более чем в два раза быстрее, чем резидентное использование, поскольку MongoDB поддерживает два представления резидентной памяти в пространстве виртуальной памяти.

Когда MongoDB перезапускается, он начинается с нуля и с учетом определенных временных рамок для вашего рабочего набора данных с регулярным предсказуемым использованием, вы должны получить хорошее представление о том, каков размер вашего рабочего набора с точки зрения ОЗУ.

Документы MongoDB содержат дополнительную информацию, которая помогает описать, как он использует память: http://docs.mongodb.org/manual/faq/storage/#faq-storage-memory-mapped-files

Более глубокий технический взгляд на уровень хранения MongoDB представлен здесь: http://www.mongodb.com/presentations/understanding-mongodb-storage-performance-and-data-safety

Поскольку виртуальная память фактически бесплатна, никто не пытается очистить ее или минимизировать ее использование. Пока размер резидентского набора разумный, я бы не беспокоился об этом.