MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Поправяне на грешки в страницата в MongoDB

Грешките в страницата са често срещана грешка, която се появява най-вече в голямо приложение, включващо големи данни. Това се случва, когато базата данни MongoDB чете данни от физическа памет, а не от виртуална памет. Грешки при грешка в страницата възникват в момента, в който MongoDB иска да получи данни, които не са налични в активната памет на базата данни, поради което е принуден да чете от диск. Това създава голямо забавяне на операциите с пропускателна способност, което прави заявките да изглеждат като изоставащи.

Коригирането на производителността на MongoDB чрез настройка е жизненоважен компонент, който оптимизира изпълнението на приложение. Базите данни са подобрени за работа с информация, съхранявана на диска, но обикновено кешират големи количества данни в RAM в опит за достъп до диска. Съхраняването и достъпът до данни от базата данни е скъпо, следователно информацията трябва първо да се съхранява на диска, преди да се позволи на приложенията да имат достъп до нея. Поради факта, че дисковете са по-бавни в сравнение с кеша на RAM данни, следователно процесът отнема значително време. Следователно, MongoDB е проектиран да съобщава за възникване на грешки в страницата като обобщение на всички инциденти за една секунда

Топологията на движението на данни в MongoDB

Данните от клиента се преместват във виртуалната памет , където кешът на страницата ги чете, докато са записани, след това данните се съхраняват на диска, както е показано на диаграмата по-долу.

Как да намерим грешки в страницата на MongoDB

Грешките в страницата могат да бъдат открити чрез заключваща производителност, която гарантира последователност на данните в MongoDB. Когато дадена операция е на опашка или се изпълнява дълго време, производителността на MongoDB се влошава и операцията се забавя , докато чака заключване. Това води до забавяне, тъй като забавянията, свързани със заключване, са спорадични и понякога се отразяват на производителността на приложението. Заключването влияе върху производителността на приложение, когато заключванията са разделени (locks.timeAcquiringMicros от locks.acquireWaitCount), това дава средното време за изчакване за даден режим на заключване. Locks.deadLockCount дава общата сума на всички преживяни безизходица при придобиване на заключване. Като се има предвид, че globalLock.totalTime  е хармонично висок, има много заявки, които очакват заключване. Тъй като повече заявки чакат за заключване, се консумира повече RAM и това води до грешки на страницата.

Можете също да използвате mem.mapped, което позволява на разработчиците да проверяват внимателно общата памет, която mongod използва. Mem.mapped е сървърен оператор за проверка на количеството памет в мегабайти (MB) в MMAPv1 механизъм за съхранение. Ако операторът mem.mapped показва стойност, по-голяма от общото количество системна памет, тогава ще се получи грешка в страницата, тъй като такова голямо количество използване на паметта ще доведе до  грешка на страницата в базата данни.

Как възникват грешките на страницата в MongoDB

Зареждането на страници в MongoDB зависи от наличието на свободна памет, в случай че липсва свободна памет, тогава операционната система трябва:

  1. Потърсете страница, която базата данни е престанала да използва и запишете страницата на диска с памет.
  2. Заредете заявената страница в паметта, след като я прочетете от диска.

Тези две дейности се извършват, когато страниците се зареждат и по този начин отнема много време в сравнение с четенето в активна памет, което води до възникване на грешки в страницата.

Решаване на грешки в страницата на MongoDB

Следват някои начини, чрез които човек може да разреши грешки в страницата: 

  1. Вертикално мащабиране към устройства с достатъчно RAM или хоризонтално мащабиране: Когато няма достатъчно RAM за  даден набор от данни, тогава правилният подход е да увеличите RAM паметта чрез вертикално мащабиране на устройства с повече RAM, за да добавите повече ресурси към сървъра. Вертикалното мащабиране е един от най-добрите и лесни начини за повишаване на производителността на MongoDB, като не се разпределя натоварването между множество сървъри. Доколкото вертикалното мащабиране добавя повече RAM, хоризонталното мащабиране позволява добавяне на повече фрагменти към разделен клъстер. С прости думи, хоризонталното мащабиране е мястото, където базата данни е разделена на различни парчета и се съхранява на множество сървъри. Хоризонталното мащабиране позволява на разработчика да добавя повече сървъри към полета и това повишава значително производителността на базата данни, тъй като по този начин не води до нулев престой. Вертикалното и хоризонталното мащабиране намаляват възможността за отстраняване на грешки в страницата чрез увеличаване на паметта, която работи по време на работа с базата данни.
  2. Индексирайте данните правилно: Използване на подходящи индекси, за да се гарантира, че има ефективни заявки, които не предизвикват сканиране на колекция. Правилното индексиране гарантира, че базата данни няма да претърсва всеки документ в колекцията и по този начин разрешава възможната поява на грешка в страницата. Сканирането на колекцията причинява грешка в страницата, тъй като цялата колекция се проверява от машината за заявки, докато се чете в RAM. Повечето от документите в сканирането на колекцията не се връщат в приложението и по този начин причиняват ненужни грешки в страницата за всяка следваща заявка, която не е лесна за избягване. В допълнение, излишните индекси могат също да доведат до неефективно използване на RAM, което може да доведе до грешка в страницата. Следователно правилното индексиране е от първостепенно значение, ако разработчик възнамерява да разреши грешките при грешки в страницата. MongoDB предлага помощ при определяне на индексите, които човек трябва да разгръща при използване на базата данни. Те предлагат както Slow Query Analyzer, който дава необходимата информация за това как да се индексира за потребители, така и за споделени потребители.
  3. Мигриране към най-новата версия на MongoDB, след което преместване на приложението към WiredTiger. Това е необходимо, ако възнамерявате да избегнете грешка при грешка в страницата, тъй като грешките в страницата са често срещани само в MMAPv1 двигателите за съхранение, за разлика от по-новите версии и WiredTiger. MMAPv1 механизмът за съхранение е отхвърлен и MongoDB вече не го поддържа. WiredTiger е текущата машина за съхранение по подразбиране в MongoDB и  има MultiVersion Concurrency Control, което я прави много по-добра в сравнение с MMAPv1 машината за съхранение. С WiredTiger MongoDB може да използва както кеш на файловата система, така и вътрешен кеш на WiredTiger, който има много голям размер от 1GB (50% 0f (RAM - 1GB)) или 256 MB.
  4. Проследявайте общата налична RAM памет за използване във вашата система. Това може да стане с помощта на услуги като New Relic мониторинг на Google Cloud Monitoring. Освен това BindPlane може да се използва със споменатите услуги за наблюдение в облак. Използването на система за наблюдение е проактивна  мярка, която позволява да се противодейства на грешките в страниците, преди те да се случат, вместо да реагират на възникващи грешки в страницата. BindPlane позволява на монитора да настрои постоянни сигнали за възникване на грешки в страницата, алармите също така правят човек наясно с броя на индексите, размера на индекса и размера на файла.
  5. Уверете се, че данните са конфигурирани в преобладаващия работен набор и няма да използват повече RAM от препоръчаното. MongoDB е система за бази данни, която работи най-добре, когато често достъпните данни и индекси могат да се поберат перфектно в назначената памет. Размерът на RAM паметта е жизненоважен аспект при оптимизиране на производителността на базата данни, следователно трябва да се гарантира, че винаги има достатъчно RAM памет, преди да разположите приложението.
  6. Разпределяне на натоварването между екземпляри на mongod чрез добавяне на части или разгръщане на разделен клъстер. От жизненоважно значение е да се даде възможност за засенчване на мястото, където се намира целевата колекция. Първо,  свържете се с mongos в mongo shell и използвайте метода по-долу.
    1. sh.shardCollection()

      След това създайте индекс по този метод.

      ​db.collection.createIndex(keys, options)
      Създаденият индекс поддържа ключа на шарда, тоест ако създадената колекция вече е получила или съхранила някои данни. Ако обаче колекцията няма данни (празна), използвайте метода по-долу, за да я индексирате като част от ssh.shardCollection: sh.shardCollection()
    2. Това е последвано от една от двете стратегии, предоставени от mongoDB.
      1. Хеширано засенчване 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Засенчване, базирано на диапазона 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Как да предотвратим грешки в страницата на MongoDB

  1. Добавете части или разгръщайте разчленен клъстер, за да разпределите натоварването
  2. Имайте достатъчно RAM за приложението си, преди да го разгърнете
  3. Преместете се към по-новите версии на MongoDB, след което преминете към WiredTiger
  4. Мащабиране вертикално или хоризонтално за устройство с повече RAM 
  5. Използвайте препоръчителната RAM и следете използваното RAM пространство

Заключение 

Няколко броя грешки на страниците (само) отнемат кратко време, но в ситуация, в която има множество грешки на страниците (обобщени), това е индикация, че базата данни чете голям брой данни в диска. Когато се случи агрегиране, ще има повече заключвания за четене на MongoBD, които ще доведат до грешка в страницата.

Когато използвате MongoDB, размерът на RAM за системата и броят на заявките могат значително да повлияят на производителността на приложението. Производителността на приложение в MongoDB разчита до голяма степен на наличната RAM на физическата памет, което влияе върху времето, необходимо на приложението да направи една заявка. При достатъчно RAM  възникването на грешки в страниците е намалено и производителността на приложението се подобрява.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Преобразувайте DBObject в POJO с помощта на MongoDB Java драйвер

  2. Създаване на администраторска зона за пет минути с AdminBro, express, mongoDB, mongoose

  3. Разгръщане на облачни бази данни с ClusterControl 1.6

  4. Как използвате Mongoose, без да дефинирате схема?

  5. JSON.NET грешка при предаване при сериализиране на Mongo ObjectId