Masalah kinerja yang Anda amati pada kueri awal kemungkinan merupakan salah satu masalah berikut (dalam urutan kemungkinan yang kasar):
1) Aplikasi / layanan web Anda memiliki beberapa overhead untuk diinisialisasi pada permintaan pertama (yaitu mengalokasikan memori, menyiapkan kumpulan koneksi, menyelesaikan DNS, ...).
2) Indeks atau data yang Anda minta belum ada di memori, jadi perlu dimuat.
3) Pengoptimal Kueri mungkin memerlukan waktu sedikit lebih lama untuk dijalankan pada permintaan pertama, karena ini membandingkan eksekusi rencana untuk pola kueri Anda.
Akan sangat membantu untuk menguji kueri melalui mongo
shell, dan pisahkan apakah overhead terkait dengan MongoDB atau layanan web Anda (daripada mengatur waktu keduanya, seperti yang telah Anda lakukan).
Berikut adalah beberapa catatan terkait dengan MongoDB.
Menyimpan cache
MongoDB tidak memiliki waktu "caching" untuk dokumen di memori. Ini menggunakan file yang dipetakan memori untuk I/O disk dan dokumen dalam memori didasarkan pada kueri aktif Anda (dokumen/indeks yang baru saja Anda muat) serta memori yang tersedia. Manajer memori virtual sistem operasi bertanggung jawab atas caching , dan biasanya akan mengikuti algoritme Least-Recently Used (LRU) untuk memutuskan halaman mana yang akan ditukar dari memori.
Penggunaan Memori
Perilaku yang diharapkan adalah bahwa dari waktu ke waktu MongoDB akan berkembang menggunakan semua memori kosong untuk menyimpan kumpulan data kerja aktif Anda.
Melihat db.stats()
yang Anda berikan nomor (dan dengan asumsi itu adalah satu-satunya your Anda database), sepertinya ukuran database Anda saat ini sekitar 1 Gb sehingga Anda harus dapat menyimpan semuanya dalam total RAM 10 Gb Anda kecuali:
- ada proses lain yang bersaing untuk mendapatkan memori
- Anda telah memulai ulang
mongod
server dan dokumen/indeks tersebut belum diminta
Di MongoDB 2.2, ada touch
baru
perintah yang dapat Anda gunakan untuk memuat indeks atau dokumen ke dalam memori setelah server restart. Ini hanya boleh digunakan pada startup awal untuk "memanaskan" server, karena jika tidak, Anda dapat dengan tidak membantu memaksa data "aktif" yang sebenarnya keluar dari memori.
Pada sistem linux, misalnya, Anda dapat menggunakan top
perintah dan harus melihat bahwa:
- byte virtual/VSIZE akan cenderung menjadi ukuran seluruh database
- jika server tidak menjalankan proses lain, byte penduduk/RSIZE akan menjadi total memori mesin (ini termasuk konten cache sistem file)
mongod
tidak boleh menggunakan swap (karena file dipetakan ke memori)
Anda dapat menggunakan mongostat
alat untuk melihat sekilas mongod
Anda aktivitas .. atau lebih berguna, gunakan layanan seperti MMS
untuk memantau metrik dari waktu ke waktu.
Pengoptimal Kueri
MongoDB Pengoptimal Kueri
membandingkan eksekusi rencana untuk pola kueri setiap ~1.000 operasi penulisan, lalu menyimpan rencana kueri "pemenang" dalam cache hingga waktu berikutnya pengoptimal berjalan .. atau Anda secara eksplisit memanggil explain()
pada kueri itu.
Ini harus mudah untuk diuji:jalankan kueri Anda di mongo
shell dengan .explain()
dan lihat waktu ms, dan juga jumlah entri indeks dan dokumen yang dipindai. Waktu untuk explain() bukanlah waktu sebenarnya yang dibutuhkan kueri untuk dijalankan, karena mencakup biaya untuk membandingkan rencana. Eksekusi tipikal akan jauh lebih cepat .. dan Anda dapat mencari kueri lambat di mongod
log.
Secara default MongoDB akan mencatat semua kueri lebih lambat dari 100 md, jadi ini memberikan titik awal yang baik untuk mencari kueri untuk dioptimalkan. Anda dapat menyesuaikan nilai ms lambat dengan --slowms
config, atau menggunakan Database Profiler
perintah.