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 top
perintah, 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.)
lsb-release -a
danuname -a
tolong)uname
tetapi saya belumlsb-release
menginstal.Jawaban:
Ukuran memori penduduk menunjukkan jumlah halaman dalam memori yang benar-benar tersentuh oleh
mongod
proses. 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: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.
sumber