Pemanfaatan CPU tinggi pada instans ApsaraDB for MongoDB—terkadang mendekati 100%—dapat memperlambat operasi baca/tulis dan mengganggu operasi bisnis. Ikuti langkah-langkah diagnostik berikut untuk mengidentifikasi dan menyelesaikan akar permasalahan.
Periksa operasi yang sedang berjalan
Hubungkan ke instans menggunakan mongo shell. Prosedur koneksi bervariasi tergantung arsitektur instans:
Jalankan db.currentOp() untuk mencantumkan semua operasi yang sedang berjalan pada instans:
db.currentOp()Contoh output:
{
"desc" : "conn632530",
"threadId" : "140298196924160",
"connectionId" : 632530,
"client" : "11.xxx.xxx.236:57052",
"active" : true,
"opid" : 1008837885,
"secs_running" : 0,
"microsecs_running" : NumberLong(70),
"op" : "update",
"ns" : "mygame.players",
"query" : {
"uid" : NumberLong(31577677)
},
"numYields" : 0,
"locks" : {
"Global" : "w",
"Database" : "w",
"Collection" : "w"
},
....
}Fokus pada bidang-bidang berikut untuk mengidentifikasi operasi bermasalah:
Field | Description | When to act |
| Klien yang mengirim permintaan | Gunakan ini untuk melacak kembali sumber permintaan |
| ID operasi unik | Jalankan |
| Lama waktu operasi berjalan, dalam detik | Investigasi operasi dengan nilai yang tidak terduga besar |
| Lama waktu operasi berjalan, dalam mikrodetik | Investigasi operasi dengan nilai yang tidak terduga besar |
| Namespace (koleksi) yang dipindai | Cocokkan dengan log kueri lambat untuk menemukan koleksi yang sering diakses |
| Jenis operasi: | — |
| Informasi lock untuk operasi | Lihat FAQ: Concurrency |
Untuk informasi lebih lanjut tentang db.currentOp(), lihat db.currentOp().
Penyebab umum lonjakan CPU adalah operasi O&M—seperti pemindaian koleksi penuh—yang berjalan bersamaan dengan workload reguler Anda. Jika db.currentOp() menunjukkan operasi dengan nilai secs_running besar yang tidak Anda harapkan, hentikan operasi tersebut:
db.killOp(<opid>)Ganti <opid> dengan nilai dari field opid pada output db.currentOp(). Untuk informasi lebih lanjut, lihat db.killOp().
Analisis log kueri lambat
Jika pemanfaatan CPU meningkat segera setelah aplikasi Anda dimulai dan tetap tinggi, tetapi db.currentOp() tidak menunjukkan operasi bermasalah yang jelas, penyebabnya kemungkinan besar adalah pola kueri lambat yang terakumulasi seiring waktu.
Lihat log kueri lambat di Konsol ApsaraDB for MongoDB. Untuk informasi lebih lanjut, lihat Lihat log kueri lambat.
Contoh entri log kueri lambat terlihat seperti berikut:
{
"atype": "slowOp",
"param": {
"op": "query",
"ns": "abbott_analysis.uaidScanInfo",
"query": {
"find": "uaidScanInfo",
"filter": {
"dateType": 2,
"companyCode": "GMP"
},
"ntoreturn": -1,
"sort": {
"scanDateTime": -1
}
},
"keysExamined": 0,
"docsExamined": 2181021,
"hasSortStage": true,
"cursorExhausted": true,
"numYield": 17059,
"locks": { ... },
"nreturned": 0,
"responseLength": 20,
"millis": 4878,
"planSummary": "COLLSCAN"
},
"result": "OK"
}Perhatikan pola-pola berikut dalam log kueri lambat:
Pemindaian koleksi penuh (COLLSCAN, docsExamined)
planSummary: COLLSCAN berarti kueri memindai seluruh koleksi tanpa menggunakan indeks. Field docsExamined menunjukkan jumlah dokumen yang dipindai—semakin tinggi angka ini, semakin banyak CPU yang dikonsumsi oleh kueri tersebut.
Buat indeks pada field yang dikueri untuk memperbaiki hal ini:
db.<collection>.createIndex({ <field>: 1 })Indeks tidak efisien (IXSCAN, keysExamined)
Saat kueri menggunakan indeks, planSummary menunjukkan IXSCAN. Field keysExamined menunjukkan jumlah kunci indeks yang dipindai. Semakin besar nilainya, semakin banyak resource CPU yang digunakan oleh permintaan tersebut.
Contoh selektivitas indeks
Pertimbangkan koleksi di mana field x hanya memiliki dua nilai yang mungkin (1 atau 2), sedangkan y memiliki rentang nilai yang jauh lebih luas (1 hingga 100000). Untuk kueri { x: 1, y: 2 }:
{ x: 1, y: 1 }
{ x: 1, y: 2 }
...
{ x: 1, y: 100000 }
{ x: 2, y: 1 }
...Index | Selectivity | Reason |
| Poor | Setengah koleksi memiliki nilai |
| Poor | Field awal |
| Good |
|
| Good | Field awal |
Indeks field dengan selektivitas tinggi terlebih dahulu. Untuk informasi lebih lanjut, lihat Compound indexes.
Indeks berlebihan memengaruhi kinerja penulisan dan pembaruan. Jika aplikasi Anda melibatkan banyak operasi tulis dan Anda menggunakan indeks, kinerja aplikasi dapat terganggu. Audit dan hapus indeks yang tidak digunakan jika kinerja tulis juga menurun.
Pengurutan di memori (SORT, hasSortStage)
hasSortStage: true berarti instans mengurutkan hasil kueri di memori karena tidak ada indeks yang memenuhi urutan pengurutan. Pengurutan di memori pada set hasil besar mengonsumsi CPU secara signifikan.
Jika log kueri lambat mengandung kata kunci SORT, buat indeks pada field yang digunakan dalam klausa pengurutan:
db.<collection>.createIndex({ <sort-field>: 1 })Operasi lain yang menyebabkan CPU tinggi
Pembuatan indeks dan pipeline aggregation (yang menggabungkan traversal, filtering, pembaruan, dan pengurutan) juga dapat menyebabkan CPU tinggi. Terapkan pendekatan diagnostik yang sama: periksa docsExamined, keysExamined, hasSortStage, dan planSummary dalam log kueri lambat.
Evaluasi kapasitas layanan
Jika semua kueri sudah menggunakan indeks yang sesuai namun pemanfaatan CPU tetap tinggi, instans mungkin telah mencapai batas kapasitasnya.
Tinjau data pemantauan untuk memahami pola penggunaan resource Anda. Untuk informasi lebih lanjut, lihat Lihat data pemantauan dan Pemantauan node (sebelumnya pemantauan dasar).
Uji database MongoDB Anda untuk menentukan apakah instans saat ini memberikan kinerja dan kapasitas layanan yang dibutuhkan untuk workload Anda.
Jika Anda perlu melakukan upgrade instans, lihat Ubah konfigurasi instans atau Ubah jumlah node dalam instans set replika.
Referensi cepat
Command | Purpose |
| Cantumkan semua operasi yang sedang berjalan pada instans |
| Hentikan operasi tertentu berdasarkan ID operasinya |
Lihat log kueri lambat di Konsol | Identifikasi kueri lambat tanpa perlu menghubungkan ke instans |