MongoDB Tidak Menggunakan Semua RAM yang Tersedia

9

Saya memiliki sesuatu yang bernilai sekitar 200 GB yang disimpan dalam cluster mongo. Memori fisik pada salah satu instance yang menjalankan mongo adalah 8GB. Tidak ada konsekuensi lain yang dijalankan pada instance ini. Sejauh yang saya mengerti berdasarkan dokumen Mongo (seperti ini: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ) ini berarti bahwa proses mongod harus menggunakan sekitar 100% dari memori fisik yang tersedia. Tetapi jika Anda melihat output berikut dari topperintah, Anda akan melihat bahwa instance mongod hanya menggunakan 2GB memori penduduk dan ada 2GB memori fisik gratis yang tersedia yang tidak digunakan sama sekali.

Dapatkah seseorang menjelaskan perilaku ini kepada saya? Mengapa ada 2GB memori bebas?

top keluaran:

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 Informasi:

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

Catatan:

  • Ada contoh lain di kluster ini di mana mongod berperilaku seperti yang saya harapkan dan menggunakan semua memori yang tersedia.
  • Melihat mongostat sepertinya secara konsisten mengalami beberapa kesalahan halaman, jadi jumlah memori yang digunakan harus bertambah:
  • (Saya mengajukan pertanyaan yang sama pada grup google mongodb-user tetapi tidak mendapat tanggapan.)
Chris W.
sumber
Apa distro Linux? Apakah 32 atau 64-bit? (Sunting pertanyaan Anda dengan output lsb-release -adan uname -atolong)
Philᵀᴹ
Terima kasih. Ditambahkan unametetapi saya belum lsb-releasemenginstal.
Chris W.
Apakah Anda secara tidak sengaja mengunduh MongoDB versi 32-bit? Ukuran maksimum instance Mongo 32-bit adalah 2GB.
Aaron
@ BryceAtNetwork23 tidak; kami pasti memiliki lebih dari 2GB total mongodb kami (beberapa ratus pertunjukan sebenarnya).
Chris W.
@ Chris, maksudnya ukuran memori maks - bukan ukuran basis data. Dan sepertinya itu akan menjelaskan 2GB dengan baik.
rfusca

Jawaban:

5

Ukuran memori penduduk menunjukkan jumlah halaman dalam memori yang benar-benar tersentuh oleh mongodproses. Jika itu secara signifikan lebih rendah dari memori yang tersedia dan data melebihi memori yang tersedia (milik Anda), maka itu bisa menjadi kasus yang belum cukup aktif menyentuh halaman.

Untuk menentukan apakah ini masalahnya, Anda harus menjalankan free -m, hasilnya akan terlihat seperti ini:

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

Dalam contoh saya, cache tidak dekat dengan total, yang berarti bahwa tidak hanya memiliki banyak halaman tidak menyentuh, cache sistem file bahkan belum diisi oleh halaman yang dibaca dari disk secara umum.

Obat cepat untuk ini adalah perintah sentuh (ditambahkan pada 2.2) - harus digunakan dengan hati-hati pada set data besar karena akan mencoba memuat semuanya ke dalam RAM bahkan jika data terlalu besar untuk muat (menyebabkan banyak disk IO dan kesalahan halaman). Ini tentu akan mengisi memori secara efektif :)

Jika nilai yang di-cache Anda dekat dengan total yang tersedia, maka masalah Anda adalah bahwa sejumlah besar halaman yang dibaca ke dalam memori dari disk tidak relevan dengan (dan karenanya tidak tersentuh oleh) proses mongod. Calon biasa untuk jenis ketidakcocokan ini adalah readahead. Saya sudah membahas topik tertentu di tempat lain secara terperinci, jadi saya hanya akan menautkan kedua jawaban itu untuk dibaca nanti jika perlu.

Adam C
sumber