MongoDB Kullanılabilir Tüm RAM'leri Kullanmıyor


9

Bir mongo kümesinde depolanmış yaklaşık 200 GB'lik bir veri var. Mongo çalıştıran örneklerden birinin üzerindeki fiziksel bellek 8 GB'dir. Sonuçta başka hiçbir şey bu örnek üzerinde çalışmaz. Mongo'nun belgelerine dayanarak anlayabildiğim kadar yakın (bunun gibi: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ) bu, mongod sürecinin yaklaşık% 100'ünü kullanması gerektiği anlamına gelir. kullanılabilir fiziksel bellek. Ancak topkomuttan aşağıdaki çıktıya bakarsanız , mongod örneğinin yalnızca 2GB yerleşik bellek kullandığını ve hiç kullanılmayan tam 2GB boş fiziksel bellek olduğunu görürsünüz.

Birisi bana bu davranışı açıklayabilir mi? Neden 2GB boş hafıza var?

top çıktı:

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
 ...

Sistem bilgisi:

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

Notlar:

  • Bu kümede, mongodun beklediğim gibi davrandığı ve mevcut tüm belleği kullandığı başka bir örnek daha var.
  • Sürekli kullanılan belleğin bazı sayfa-faylanma, böylece miktarını yapıyorduk benziyor mongostat baktığımızda olmalıdır büyüyen:
  • ( Aynı soruyu mongodb kullanıcısı google grubunda sordum ama yanıt alamadım.)

Hangi Linux dağıtımı? 32 veya 64 bit mi? (Sorunuzu lsb-release -auname -a
çıktısıyla düzenleyin

Teşekkürler. Ekledim unameama yüklemedim lsb-release.
Chris W.

MongoDB'nin 32 bit sürümünü yanlışlıkla indirdiniz mi? 32 bit Mongo örneğinin maksimum boyutu 2 GB'dir.
Aaron

@ BryceAtNetwork23 hayır; mongodb toplamımızda kesinlikle 2GB'den fazla var (birkaç yüz konser).
Chris W.

@ChrisW veritabanı boyutu değil, maksimum bellek boyutu anlamına gelir. Ve bu 2GB'ı iyi açıklayacak gibi görünüyor.
rfusca

Yanıtlar:


5

Yerleşik bellek boyutu, bellekteki mongodişlem tarafından gerçekte dokunulan sayfa sayısını temsil eder . Bu, kullanılabilir bellekten önemli ölçüde daha düşükse ve veriler kullanılabilir belleği aşarsa (sizinki), o zaman henüz aktif olarak yeterince sayfa dokunmamış olabilir.

Durumun böyle olup olmadığını belirlemek için, çalıştırmalısınız free -m, çıktı aşağıdaki gibi görünmelidir:

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

Örneğimde, önbelleğe alınan toplama yakın değil, yani mongod yeterli sayfalara dokunmakla kalmadı, aynı zamanda dosya sistemi önbelleği genel olarak diskten okunan sayfalarla bile doldurulmadı.

Bunun için hızlı bir çözüm dokunmatik komut olacaktır (2.2'de eklenmiştir) - veriler sığmayacak kadar büyük olsa bile (çok fazla veriye neden olsa bile) her şeyi RAM'e yüklemeye çalışacağı için büyük veri kümelerinde dikkatli kullanılmalıdır. disk GÇ ve sayfa hataları). Yine de belleği etkili bir şekilde dolduracaktır :)

Önbelleğe alınan değeriniz kullanılabilir toplama yakınsa, sorununuz, diskten belleğe okunan çok sayıda sayfanın mongod işlemiyle ilgili olmadığı (ve dolayısıyla dokunulmadığı )dır. Bu tür bir tutarsızlık için olağan aday övgüye değerdir. Bu konuyu başka bir yerde ayrıntılı olarak ele aldım, bu yüzden gerekirse bu iki cevabı ileride okumak için bağlayacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.