All Products
Search
Document Center

ApsaraDB for MongoDB:Pemecahan masalah pemanfaatan CPU tinggi pada instans ApsaraDB for MongoDB

Last Updated:Mar 29, 2026

Pemanfaatan CPU tinggi pada instans ApsaraDB for MongoDB—terkadang mendekati 100%—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.192.159.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 yang bermasalah:

FieldDescriptionWhen to act
clientClient yang mengirim permintaanGunakan ini untuk melacak kembali sumber permintaan
opidID operasi unikJalankan db.killOp(opid) untuk menghentikan operasi jika diperlukan
secs_runningLama operasi berjalan, dalam satuan detikSelidiki operasi dengan nilai yang tidak terduga besar
microsecs_runningLama operasi berjalan, dalam satuan mikrodetikSelidiki operasi dengan nilai yang tidak terduga besar
nsNamespace (koleksi) yang dipindaiBandingkan silang dengan log kueri lambat untuk menemukan koleksi yang sering diakses
opJenis operasi: query, insert, update, atau delete
locksInformasi lock untuk operasiLihat 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 yang jelas bermasalah, 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 tampak seperti ini:

{
  "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 menampilkan 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 mencakup 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 }
...
IndexSelectivityReason
db.createIndex({ x: 1 })PoorSetengah koleksi memiliki nilai x yang sama
db.createIndex({ x: 1, y: 1 })PoorField utama x masih memiliki selektivitas rendah
db.createIndex({ y: 1 })Goody memiliki rentang nilai luas — hanya sedikit dokumen yang memiliki nilai yang sama
db.createIndex({ y: 1, x: 1 })GoodField utama y langsung mengeliminasi sebagian besar dokumen

Indeks field dengan selektivitas tinggi terlebih dahulu. Untuk informasi lebih lanjut, lihat Design Principles of MongoDB Indexes dan Compound indexes.

Terlalu banyak indeks memengaruhi kinerja operasi write dan update. Jika aplikasi Anda melibatkan banyak operasi write dan Anda menggunakan indeks, kinerja aplikasi dapat terganggu. Audit dan hapus indeks yang tidak digunakan jika kinerja write juga menurun.

Pengurutan di memori (SORT, hasSortStage)

hasSortStage: true berarti instans melakukan pengurutan hasil kueri di memori karena tidak ada indeks yang memenuhi urutan sort. Pengurutan di memori pada set hasil yang besar mengonsumsi CPU secara signifikan.

Jika log kueri lambat mengandung kata kunci SORT, buat indeks pada field yang digunakan dalam klausa sort:

db.<collection>.createIndex({ <sort-field>: 1 })

Operasi lain yang menyebabkan CPU tinggi

Pembuatan indeks dan pipeline aggregation (yang menggabungkan traversal, filtering, update, dan sorting) 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 telah menggunakan indeks yang sesuai namun pemanfaatan CPU tetap tinggi, instans mungkin telah mencapai batas kapasitasnya.

  1. Tinjau data pemantauan untuk memahami pola penggunaan resource Anda. Untuk informasi lebih lanjut, lihat Lihat data pemantauan dan Pemantauan node (sebelumnya pemantauan dasar).

  2. Periksa apakah spesifikasi instans saat ini memenuhi kebutuhan workload Anda. Jika perlu, lakukan upgrade instans. Untuk informasi lebih lanjut, lihat Ubah konfigurasi instans atau Ubah konfigurasi instans set replika.

Referensi cepat

CommandPurpose
db.currentOp()Cantumkan semua operasi yang sedang berjalan pada instans
db.killOp(<opid>)Hentikan operasi tertentu berdasarkan ID operasinya
Lihat log kueri lambat di KonsolIdentifikasi kueri lambat tanpa harus terhubung ke instans