Server MongoDB menyediakan statistik operasinya melalui perintah db.serverStatus(), sedangkan profiler merekam operasi yang dipilih ke dalam koleksi system.profile. Topik ini membahas pembacaan statistik server, pengaktifan profiler pada basis data operasional, dan pembacaan isi profil untuk menemukan query yang memeriksa terlalu banyak dokumen. Data contohnya berupa koleksi log_kegiatan yang berisi enam catatan aktivitas harian, sehingga setiap angka pada profil dapat dihitung ulang dari data tanamannya.
Membaca statistik server#
Perintah db.serverStatus() mengembalikan satu dokumen besar yang menggambarkan keadaan server pada saat dipanggil. Isinya mencakup penghitung operasi, koneksi, memori, dan penyimpanan yang dihitung sejak server dijalankan, sehingga hampir semua nilai di dalamnya berubah terus. Cara membacanya adalah membandingkan dua pengambilan pada waktu berbeda dan mengamati selisihnya, bukan menilai satu angka begitu saja.
Sebagian field menunjukkan identitas server dan tidak berubah, sehingga aman untuk ditampilkan. Storage engine yang dipakai server pada jalur ini adalah wiredTiger.
db.serverStatus().storageEngine.namewiredTigerPenghitung operasi berada pada field opcounters yang membaginya menjadi insert, query, update, delete, getmore, dan command. Selisih opcounters.insert sebelum dan sesudah satu operasi penyisipan harus tepat satu, sebagaimana dihitung berikut.
const sebelum = db.serverStatus().opcounters.insert
db.penghitung_uji.insertOne({ catatan: "uji penghitung operasi" }).acknowledged
const sesudah = db.serverStatus().opcounters.insert
sesudah - sebelum
db.penghitung_uji.drop()true
1
truePola selisih itulah inti pemantauan server. Field connections melaporkan banyaknya koneksi yang aktif dan yang pernah dibuat, sedangkan field metrics dan wiredTiger memuat penghitung cache serta transaksi. Banyak field lain memuat uptime, tanggal, dan pengenal proses yang berbeda pada setiap pembacaan, sehingga contoh pada topik ini hanya menampilkan bagian yang stabil. Untuk operasi yang sedang berjalan, db.currentOp() menyediakan daftarnya, dan field-fieldnya juga bersifat dinamis sehingga hanya layak dibandingkan antarwaktu.
Merekam operasi dengan profiler#
Profiler merekam operasi yang telah selesai dijalankan ke dalam koleksi terbatas (capped) bernama system.profile pada basis data yang sama. Tingkat profilnya diatur dengan db.setProfilingLevel(). Tingkat 0 mematikan perekaman, tingkat 1 merekam operasi yang durasinya melewati ambang slowms, dan tingkat 2 merekam seluruh operasi tanpa memandang durasinya. Contoh berikut memakai tingkat 1 dengan slowms 0 agar setiap operasi terekam dan keluarannya dapat direproduksi, sedangkan pada server nyata nilai slowms lazimnya puluhan hingga ratusan milidetik.
Tingkat profil melekat pada basis data tempat perintahnya dijalankan, sehingga basis data kerja dipilih terlebih dahulu.
use operasionalswitched to db operasionaldb.setProfilingLevel(1, { slowms: 0 }).ok1Koleksi log_kegiatan diisi enam dokumen. Karena profiler sudah menyala, operasi penyisipan ini terekam juga di samping kedua query yang mengikutinya.
db.log_kegiatan.insertMany([
{ waktu: "2026-11-01", modul: "sinkronisasi", kegiatan: "mulai layanan", durasiDetik: 12 },
{ waktu: "2026-11-01", modul: "sinkronisasi", kegiatan: "selesai unggah berkas", durasiDetik: 5 },
{ waktu: "2026-11-02", modul: "arsip", kegiatan: "perpindahan arsip harian", durasiDetik: 30 },
{ waktu: "2026-11-02", modul: "arsip", kegiatan: "hapus arsip sementara", durasiDetik: 8 },
{ waktu: "2026-11-02", modul: "laporan", kegiatan: "susun ringkasan harian", durasiDetik: 15 },
{ waktu: "2026-11-02", modul: "laporan", kegiatan: "kirim ringkasan ke berkas", durasiDetik: 3 }
]).acknowledgedtruedb.log_kegiatan.find({ modul: "sinkronisasi" }, { _id: 0, waktu: 1, modul: 1, kegiatan: 1 }).toArray()[
{
waktu: '2026-11-01',
modul: 'sinkronisasi',
kegiatan: 'mulai layanan'
},
{
waktu: '2026-11-01',
modul: 'sinkronisasi',
kegiatan: 'selesai unggah berkas'
}
]db.log_kegiatan.find({ kegiatan: "perpindahan arsip harian" }, { _id: 0, modul: 1, kegiatan: 1 }).toArray()[ { modul: 'arsip', kegiatan: 'perpindahan arsip harian' } ]Membaca isi system.profile#
Setiap entri profil memuat identitas operasi beserta statistik eksekusinya. Field op menuliskan jenis operasinya, ns menuliskan namespace tujuan berupa nama basis data dan koleksinya, dan command memuat perintah aslinya. Query berikut hanya menampilkan ketiga field tersebut agar keluarannya stabil antar eksekusi.
db.system.profile.find({ ns: "operasional.log_kegiatan" }, { op: 1, ns: 1, "command.find": 1 }).toArray()[
{ op: 'insert', ns: 'operasional.log_kegiatan', command: {} },
{
op: 'query',
ns: 'operasional.log_kegiatan',
command: { find: 'log_kegiatan' }
},
{
op: 'query',
ns: 'operasional.log_kegiatan',
command: { find: 'log_kegiatan' }
}
]Dua entri terakhir berasal dari dua query sebelumnya, sedangkan entri pertama berasal dari operasi penyisipan. Karena op entri penyisipan berupa insert, field command-nya tampil kosong pada proyeksi command.find. Entri untuk perintah administratif memuat op berupa command dengan namespace operasional.$cmd, sehingga filter berdasarkan ns atau field command menyeleksi entri yang sedang dicari.
Field statistik pada entri profil menyatakan biaya eksekusinya. Field planSummary menuliskan rencana yang dipilih server, nreturned menuliskan banyaknya dokumen yang dikembalikan, sedangkan docsExamined menuliskan banyaknya dokumen yang benar-benar diperiksa. Entri profil juga memuat field millis untuk durasi eksekusi, tetapi field itu sengaja tidak ditampilkan karena nilainya berbeda pada setiap eksekusi.
db.system.profile.find({ "command.find": "log_kegiatan" }, { op: 1, ns: 1, planSummary: 1, nreturned: 1, docsExamined: 1 }).toArray()[
{
op: 'query',
ns: 'operasional.log_kegiatan',
docsExamined: 6,
nreturned: 2,
planSummary: 'COLLSCAN'
},
{
op: 'query',
ns: 'operasional.log_kegiatan',
docsExamined: 6,
nreturned: 1,
planSummary: 'COLLSCAN'
}
]Kedua query memeriksa seluruh enam dokumen meskipun yang dikembalikan hanya dua dan satu. Nilai planSummary berupa COLLSCAN menandakan pemeriksaan koleksi penuh karena belum ada indeks pada field yang dicari. Pada koleksi yang jauh lebih besar, docsExamined yang melampaui nreturned disertai COLLSCAN merupakan tanda query yang perlu didukung indeks. Profiler dimatikan lagi setelah diagnosis selesai, dan koleksi profilnya dihapus agar tidak menyisakan koleksi terbatas yang terus berputar pada basis data.
db.setProfilingLevel(0).ok
db.system.profile.drop()1
trueKesalahan umum#
Kesalahan pertama adalah lupa mematikan profiler setelah digunakan. Profiler yang menyala terus menambah beban tulis pada server dan mengisi system.profile tanpa henti, sedangkan entri lama tergeser keluar dari koleksinya. Perbaikannya adalah menjalankan db.setProfilingLevel(0), lalu memeriksa keadaannya dengan db.getProfilingStatus() yang menampilkan tingkat yang sedang aktif.
Kesalahan kedua adalah menganggap isi system.profile tahan lama. Koleksinya berukuran terbatas, yaitu sekitar satu megabita bawaan pada basis data biasa, sehingga entri lamanya tergeser oleh entri baru dan tidak pernah dimaksudkan sebagai arsip. Perbaikannya adalah mengaktifkan profiler hanya saat diagnosis berlangsung dan menyalin entri yang diperlukan sebelum tergeser.
Kesalahan ketiga adalah mengukur performa langsung pada data latihan yang kecil. Enam dokumen selalu diperiksa dalam waktu nyaris nol, sehingga field millis tidak memberi perbandingan yang berarti. Diagnosis yang benar memakai data berukuran representatif dan menilai docsExamined serta planSummary bersamaan, bukan durasinya saja.
Ringkasan#
db.serverStatus()menyajikan penghitung kumulatif yang dibaca dengan membandingkan dua titik waktu, bukan dengan menilai satu angka.- Profiler tingkat 1 merekam operasi yang melewati ambang
slowms, tingkat 2 merekam semuanya, dan tingkat 0 mematikannya. - Entri
system.profilememuatop,ns,command,planSummary,nreturned, dandocsExaminedyang menjelaskan biaya sebuah query. docsExaminedyang jauh melampauinreturneddisertaiCOLLSCANmenandakan query yang perlu didukung indeks.
Referensi#
- serverStatus — MongoDB Manual — Dokumentasi perintah statistik server beserta field-fieldnya.
- Database Profiler — MongoDB Manual
— Penjelasan tingkat profiler dan isi entri
system.profile. - Manage the Database Profiler — MongoDB Manual — Langkah mengaktifkan, membaca, dan mematikan profiler.
- db.setProfilingLevel — MongoDB Manual
— Dokumentasi pengaturan tingkat profil dan ambang
slowms.