MongoDB припиняється, коли у нього закінчується пам'ять


11

У мене є така конфігурація:

  • хост-машина, яка працює з трьома докерними контейнерами:
    • MongoDB
    • Редіс
    • Програма, що використовує попередні два контейнери для зберігання даних

І Redis, і MongoDB використовуються для зберігання величезної кількості даних. Я знаю, що Redis повинен зберігати всі свої дані в оперативній пам'яті, і я з цим добре. На жаль, що трапляється, це те, що монго починає займати багато оперативної пам’яті, і як тільки оперативна оперативна пам’ять заповнена (ми говоримо про 32 ГБ тут), або монго, або Redis виходить з ладу.

Я прочитав наступні запитання щодо цього:

  1. Обмеження використання оперативної пам'яті MongoDB : очевидно, більшість оперативної пам’яті використовується кешем WiredTiger
  2. MongoDB обмежує пам'ять : тут, очевидно, проблемою були дані журналу
  3. Обмежте використання оперативної пам'яті в MongoDB : тут вони пропонують обмежити пам'ять монго, щоб він використовував менший об'єм пам'яті для кешу / журналів / даних
  4. MongoDB використовує занадто багато пам’яті : тут вони кажуть, що це система кешування WiredTiger, яка прагне використовувати якомога більше оперативної пам’яті для швидшого доступу. Вони також заявляютьit's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. Чи є можливість обмежити використання пам'яті mongodb? : знову кешування, вони також додаютьMongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
  6. Зв'язок індексу / оперативної пам'яті MongoDB : цитата:MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
  7. як звільнити кешування, яке використовує MongoDB? : така ж відповідь, як у 5.

Тепер, з усіх цих відповідей я розумію:

  1. Для швидшого доступу монго було б краще відповідати всім індексам оперативної пам'яті. Однак у моєму випадку я добре з показниками, що частково знаходяться на диску, оскільки у мене досить швидкий SSD.
  2. ОЗП в основному використовується для кешування монго.

З огляду на це, я очікував, що монго спробує використати якомога більше простору оперативної пам’яті, але зможе функціонувати також з невеликим простором оперативної пам’яті та вилученням більшості речей з диска. Однак я обмежив пам'ять контейнера mongo Docker (наприклад, до 8 ГБ), використовуючи --memoryта --memory-swap, але замість того, щоб витягувати речі з диска, монго просто вийшов з ладу, як тільки у нього не вистачало пам'яті.

Як я можу змусити монго використовувати лише наявну пам'ять і витягти з диска все, що не вписується в пам'ять?


Його називають вбивцею ООМ. MongoDB призначений для роботи з товарним обладнанням. Я б ніколи не використовував це на штучно обмежених ресурсах. Якщо у вас є лише невелика база даних, MongoDB не є ідеальним вибором. Якщо у вас є велика база даних (три цифри на мільйон до мільярдів записів), обмеження ресурсів - це поганий вибір. Відповідно до вашої проблеми: ви не можете мати торт і їсти його. Виберіть.
Markus W Mahlberg

Якщо правильно налаштовано, MongoDB не повинен виходити з ладу, коли немає пам'яті. Чи можете ви підтвердити конкретну версію сервера MongoDB та O / S, який ви використовуєте, а також детальніше описати збій? Наприклад, чи є повідомлення в журналі MongoDB або dmesgспіввідносяться з несподіваним відключенням? Найбільш імовірна можливість з Docker полягає в тому, що процеси в контейнері виявляють загальну доступну оперативну пам'ять, а не обмеження для контейнера.
Стенні

Відповідно до MongoDB виробництво Примітки : якщо ви біжите mongodв контейнері ( lxc, cgroups, Докер, і т.д.) , що робить НЕ має доступ до всіх оперативної пам'яті в системі, необхідно встановити storage.wiredTiger.engineConfig.cacheSizeGBна значення менше , ніж кількість наявних в оперативній пам'яті контейнер. Точна кількість залежить від інших процесів, що працюють в контейнері, але зазвичай це не повинно перевищувати значення за замовчуванням 50% ОЗУ мінус 1 ГБ.
Стенні

Відповіді:


9

Відповідно з MongoDB БОЛ Тут Змінено в версії 3.4: Значення можуть варіюватися від 256MBдо 10TBі може бути float. Крім того, також змінилося значення за замовчуванням.

Починаючи 3.4з внутрішнього кеша WiredTiger , за замовчуванням буде використовуватися більший з будь-якого:

50% of RAM minus 1 GB, or
256 MB.

З WiredTiger, MongoDB використовує як WiredTiger, так internal cache і filesystem cache.

Через filesystem cacheMongoDB автоматично використовується вся вільна пам'ять, яка не використовується WiredTiger cacheні іншими процесами.

Storage.wiredTiger.engineConfig.cacheSizeGB обмежує розмір WiredTigerвнутрішнього кеша. Операційна система використовуватиме наявну вільну пам'ять для кешу файлової системи, що дозволяє стислим файлам даних MongoDB залишатися в пам'яті. Крім того, засіб operating systemбуде використовувати будь-яку безкоштовну оперативну пам’ять для буфера блоків файлової системи та кешу файлової системи.

Щоб розмістити додаткових споживачів оперативної пам’яті , можливо, доведеться зменшити WiredTigerрозмір внутрішнього кешу.

Для подальшої редагування параметрів WiredTiger Storage Engine та параметрів конфігураційного файлу


4

Насправді, якщо ви придивитесь уважніше, не "mongod" гине для "поза пам'яті", це ядро ​​OOM (поза пам'яттю), яке вбиває mongod, оскільки воно має найбільше використання пам'яті.

Так, ви можете спробувати вирішити проблему з параметром конфігурації monngodb cacheSizeGB , але в середовищі контейнера краще використовувати cgroups для обмеження ресурсів, які отримує будь-який із трьох ваших контейнерів.

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