MongoDB не використовує всю доступну оперативну пам’ять


9

У мене є близько 200 ГБ даних, що зберігаються в кластері Монго. Фізична пам'ять одного з екземплярів, на якому працює монго, становить 8 Гб. Ніщо інше з жодних наслідків не працює в цьому випадку. Наскільки я можу зрозуміти, ґрунтуючись на документах Монго (на кшталт цього: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), це означає, що процес монгоду повинен використовувати близько 100% наявна фізична пам'ять. Але якщо ви подивитесь на наступний вихід з topкоманди, ви побачите, що монгод-екземпляр використовує лише 2 ГБ пам'яті резидента і має повний 2 ГБ вільної фізичної пам'яті, який взагалі не використовується.

Чи може хтось пояснити мені таку поведінку? Чому є 2 Гб вільної пам'яті?

top вихід:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Інформація про систему:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Примітки:

  • У цьому кластері є ще один приклад, коли mongod поводиться так, як я очікував, і використовує всю наявну пам'ять.
  • Дивлячись на монгостат, схоже, постійно виникають певні помилки на сторінці, тому об'єм використовуваної пам'яті повинен зростати:
  • задав це те саме питання в групі google mongodb-користувача, але не отримав відповіді.)

Який дистрибутив Linux? 32 чи 64-розрядні? (Відредагуйте своє запитання з результатами lsb-release -aта uname -aбудь ласка)
Philᵀᴹ

Дякую. Додано, unameале я не lsb-releaseвстановив.
Кріс В.

Ви випадково завантажили 32-бітну версію MongoDB? Максимальний розмір 32-розрядного екземпляра Mongo - 2 Гб.
Аарон

@ BryceAtNetwork23 nope; у нас, безумовно, більше 2 Гб в нашому mongodb загалом (кілька сотень концертів насправді).
Кріс В.

@ChrisW він має на увазі максимальний об'єм пам'яті - не розмір бази даних. І, здається, це добре пояснить 2 Гб.
rfusca

Відповіді:


5

Розмір пам'яті-резидента - це кількість сторінок пам'яті, які фактично торкнулися mongodпроцесу. Якщо це значно нижче наявної пам’яті, а дані перевищують наявну пам’ять (у вас є), то може бути випадком просто ще недостатньо активного торкання сторінок.

Щоб визначити, чи це так, слід запустити free -m, вихід повинен виглядати приблизно так:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

У моєму прикладі кешування не є близьким до загального, а це означає, що mongod не лише не торкнувся достатньої кількості сторінок, кеш файлової системи ще не заповнений сторінками, які читаються з диска взагалі.

Швидким засобом для усунення цього була б сенсорна команда (додана в 2.2) - її слід застосовувати з обережністю на великих наборах даних, оскільки вона намагатиметься завантажувати все в оперативну пам’ять, навіть якщо дані занадто великі, щоб вмістити (спричиняючи багато несправності IO диска та сторінки). Це, безумовно, ефективно заповнить пам'ять :)

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

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