MongoDB: вимоги оперативної пам'яті


20

Чи достатньо мати весь індекс у пам'яті / таран чи монгобб навіть намагається виділити якомога більше оперативної пам’яті, щоб зберігати навіть дані для швидкого зчитування?

Я хотів би запустити mongodb + інші програми, і, схоже, mongodb - це єдиний, який не дозволяє мені визначити діапазон оперативної пам'яті, щоб сказати "max_memory_allocated_or_reserved = 8GB".

Якщо немає можливості це зробити, я повинен пояснити убивці, що монгод - це "поганий" процес, який, на мою думку, не найкраща практика ...

Відповіді:


18

Справжня причина, чому ви не можете робити так, як ви просите (обмежте пам'ять), полягає в тому, що MongoDB не керує пам'яттю, яку вона використовує безпосередньо - це дозволяє операційній системі робити це. MongoDB просто пам'ять відображає всі свої дані, а потім має сторінку ОС, в яку вона входить і не залишається в пам'яті. Як результат, неможливе пряме управління використаною сумою, поки MongoDB не реалізує це зовсім по-іншому, або ОС це дозволить (неможливо в Linux з 2,4 дня).

Наразі єдиний спосіб по-справжньому розділити ресурси - використовувати рішення щодо віртуалізації та ізолювати MongoDB у власній віртуальній машині. Так, задіяні накладні витрати (хоча гіпервізори значно покращилися), але на даний момент це ціна, яку потрібно заплатити за цей рівень контролю за ресурсами.

Що стосується OOM Killer, навіть якщо немає жодних інших процесів на хості, доки ваш набір даних та загальні індекси перевищують наявну пам'ять, MongoDB може впливати на проблеми OOM Killer. Це пов’язано з тим, як дані завантажуються з пам'яті в пам'ять - якщо тиску в пам'яті немає (нічого більше не хоче пам'ять резидента), і ви продовжуєте додавати / торкатися нових даних та індексів, то з часом вони зростатимуть, щоб споживати всю наявну оперативну пам'ять. Звідси рекомендується завжди налаштовувати деякий своп під час роботи MongoDB:

https://docs.mongodb.com/manual/administration/production-notes/#swap

Звичайно, спочатку будуть завантажуватись дані про LRU, інші процеси також можуть зайняти запам'ятовувальну пам'ять, але ця концепція все ще застосовується, якщо ви не завантажуєте набір даних у пам'ять і тоді вони залишаються статичними. Найкраще робити, якщо ви переживаєте, це передати його в MMS і відстежувати використання з часом:

http://mms.mongodb.com

Оновлення: серпень 2015 року

З тих пір, як я написав цю відповідь, справи дещо змінилися, і інформація трохи застаріла. Наприклад, Linux тепер є контрольні групи і пов'язана з ними технологія ( докер контейнери , наприклад) , які дозріли до того, що вони дозволяють краще ізолятів і обмежити ресурси ( в тому числі і пам'ять ) , споживаних будь-який процес у виробничому середовищі, навіть той , який використовує відображення пам'яті на зразок MongoDB.

Крім того, з появою нових двигунів зберігання даних, що не входять до MMAP, таких як WiredTiger в MongoDB 3.0+, ви можете використовувати вбудовану функціональність для обмеження розміру кешу для MongoDB. Отже, вимоги оперативної пам’яті зараз дійсно залежать від того, як ви вирішите налаштувати MongoDB, у якому середовищі ви запускаєте його та який механізм зберігання даних ви вибрали.


щодо WiredTiger: " storage.wiredTiger.engineConfig.cacheSizeGB обмежує лише розмір кешу WiredTiger, а не загальний об'єм пам'яті, що використовується mongod. Кеш WiredTiger - це лише один компонент оперативної пам'яті, який використовується MongoDB. MongoDB також автоматично використовує всі вільна пам'ять на машині через кеш файлової системи ... "
Стефан Рогін

вірно, але те ж саме можна сказати про будь-яку програму, яка переносить дані з диска, кеш-пам'ять FS вже не є основним методом кешування даних, як це було колись із файлами, відображеними в пам'яті в накопичувачі MMAP
Adam C,

6

MongoDB використовуватиме наявну вільну пам’ять для кешування, а також заміняти на диск, щоб отримати пам'ять для інших програм на тому ж сервері. Для найкращої продуктивності вам потрібно буде мати достатню кількість оперативної пам’яті, щоб зберігати ваші індекси та часто використовувані дані («робочий набір») в пам'яті.

Корисне читання:


3

Щось змінюється в роки про MongoDB.

TL; DR

Якщо двигун зберігання даних MMAPv1 використовується на MongoDB, working setрозмір повинен відповідати оперативній пам'яті . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Якщо двигун зберігання даних WiredTiger використовується на MongoDB, не потрібно турбуватися про оперативну пам’ять, чи підходить вона working setчи ні . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Діагностика пам’яті для двигуна зберігання WiredTiger

Чи повинен мій робочий набір відповідати оперативній пам’яті?

Ні.

Як обчислити, скільки оперативної пам’яті потрібно для мого застосування?

За допомогою WiredTiger MongoDB використовує як внутрішній кеш WiredTiger, так і кеш файлової системи.

Змінено у версії 3.2: Починаючи з MongoDB 3.2, внутрішній кеш WiredTiger за замовчуванням використовує більший з будь-яких:

60% оперативної пам’яті мінус 1 ГБ або 1 ГБ.


ну ця відповідь не дуже допомагає, ні страшенно точна.
Філіп Шифф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.