全部产品
Search
文档中心

ApsaraDB for MongoDB:Memecahkan masalah pemanfaatan CPU tinggi pada sebuah instance

更新时间:Jul 06, 2025

Saat menggunakan instance ApsaraDB for MongoDB, pemanfaatan CPU mungkin menjadi sangat tinggi atau bahkan mendekati 100%. Hal ini dapat memperlambat operasi baca/tulis dan mengganggu operasi bisnis normal. Artikel ini menjelaskan cara menangani masalah pemanfaatan CPU tinggi pada instance ApsaraDB for MongoDB untuk aplikasi Anda.

Menganalisis permintaan yang sedang berjalan di instance

  1. Hubungkan ke instance menggunakan mongo shell.

  2. Jalankan perintah db.currentOp() untuk memeriksa operasi yang sedang berjalan di instance.

    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"
            },
            ....
        }

    Tabel berikut menjelaskan bidang-bidang yang perlu diperhatikan secara cermat.

    Bidang

    Deskripsi

    client

    Klien yang mengirimkan permintaan.

    opid

    ID unik dari operasi.

    Jika diperlukan, Anda dapat menjalankan perintah db.killOp(opid) untuk menghentikan operasi.

    secs_running

    Durasi operasi telah berjalan. Unit: detik.

    Jika nilai relatif besar dikembalikan untuk bidang ini, periksa apakah permintaan tersebut sesuai.

    microsecs_running

    Durasi operasi telah berjalan. Unit: mikrodetik.

    Jika nilai relatif besar dikembalikan untuk bidang ini, periksa apakah permintaan tersebut sesuai.

    ns

    Koleksi tempat operasi melakukan pemindaian.

    op

    Jenis operasi. Dalam banyak kasus, nilai ini adalah query, insert, update, atau delete.

    locks

    Informasi terkait kunci. Untuk informasi lebih lanjut, lihat FAQ: Konkurensi.

    Catatan

    Untuk informasi lebih lanjut tentang perintah db.currentOp(), lihat db.currentOp().

Anda dapat menjalankan perintah db.currentOp() untuk memeriksa operasi yang sedang berjalan dan menganalisis apakah instance sedang memproses permintaan yang memakan waktu. Misalnya, pemanfaatan CPU biasanya tidak tinggi untuk operasi rutin. Namun, ketika seorang insinyur O&M melakukan operasi tertentu yang memerlukan pemindaian koleksi penuh, pemanfaatan CPU meningkat signifikan dan instance menjadi lambat. Dalam hal ini, Anda harus memeriksa operasi yang memakan waktu.

Catatan

Jika menemukan permintaan abnormal, peroleh ID operasi (opid) dari permintaan tersebut dan jalankan perintah db.killOp(opid) untuk menghentikannya.

Untuk informasi lebih lanjut tentang perintah db.killOp(), lihat db.killOp().

Menganalisis permintaan lambat di instance

Jika pemanfaatan CPU instance langsung meningkat dan tetap tinggi setelah aplikasi Anda mulai berjalan, serta Anda tidak dapat menemukan permintaan abnormal dalam output perintah db.currentOp(), Anda dapat menganalisis permintaan lambat di instance.

  1. Lihat log kueri lambat instance di konsol ApsaraDB for MongoDB. Untuk informasi lebih lanjut, lihat Lihat Log Kueri Lambat.

  2. Analisis log kueri lambat untuk memecahkan masalah pemanfaatan CPU tinggi pada instance.

    Contoh berikut menunjukkan contoh log kueri lambat:

    {
      "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": {
          "Global": {
            "acquireCount": {
              "r": {
                "$numberLong": "34120"
              }
            },
            "acquireWaitCount": {
              "r": {
                "$numberLong": "7"
              }
            },
            "timeAcquiringMicros": {
              "r": {
                "$numberLong": "3152"
              }
            }
          },
          "Database": {
            "acquireCount": {
              "r": {
                "$numberLong": "17060"
              }
            }
          },
          "Collection": {
            "acquireCount": {
              "r": {
                "$numberLong": "17060"
              }
            }
          }
        },
        "nreturned": 0,
        "responseLength": 20,
        "millis": 4878,
        "planSummary": "COLLSCAN"
      },
      "result": "OK"
    }

Untuk log permintaan lambat, Anda harus memperhatikan item-item berikut dengan cermat:

  • Pemindaian koleksi penuh (kata kunci: COLLSCAN dan docsExamined)

    • COLLSCAN menunjukkan pemindaian koleksi penuh.

      Pemindaian koleksi penuh untuk permintaan (seperti operasi query, update, atau delete) dapat menyebabkan pemanfaatan CPU tinggi. Jika Anda menemukan kata kunci COLLSCAN dalam log permintaan lambat, sumber daya CPU Anda mungkin telah digunakan oleh permintaan-permintaan ini.

      Catatan

      Jika permintaan semacam ini sering diajukan, kami sarankan Anda membuat indeks pada bidang yang sering di-query untuk mengoptimalkan kinerja query.

    • Bidang docsExamined menunjukkan jumlah dokumen yang telah dipindai oleh instance untuk permintaan. Semakin besar nilai bidang ini, semakin banyak sumber daya CPU yang digunakan oleh permintaan ini.

  • Indeks yang tidak tepat (kata kunci: IXSCAN dan keysExamined)

    Catatan
    • Indeks yang berlebihan memengaruhi kinerja penulisan dan pembaruan.

    • Jika aplikasi Anda melibatkan sejumlah besar operasi penulisan dan Anda menggunakan indeks, kinerja aplikasi mungkin terpengaruh.

    Bidang keysExamined menunjukkan jumlah kunci indeks yang telah dipindai oleh instance untuk permintaan menggunakan indeks. Semakin besar nilai bidang ini, semakin banyak sumber daya CPU yang digunakan oleh permintaan ini.

    Jika Anda membuat indeks yang tidak tepat atau cocok dengan sejumlah besar data, indeks tersebut tidak dapat mengurangi beban CPU atau mempercepat eksekusi permintaan.

    Sebagai contoh, untuk data dalam koleksi, bidang x hanya dapat disetel ke 1 atau 2, sedangkan bidang y memiliki rentang nilai yang lebih luas.

    { x: 1, y: 1 }
    { x: 1, y: 2 }
    { x: 1, y: 3 }
    ......
    { x: 1, y: 100000} 
    { x: 2, y: 1 }
    { x: 2, y: 2 }
    { x: 2, y: 3 }
    ......
    { x: 1, y: 100000}

    Untuk mengambil data {x: 1, y: 2}, Anda dapat membuat indeks.

    db.createIndex( {x: 1} )         //Indeks ini tidak tepat karena sejumlah besar data memiliki nilai yang sama dengan bidang x.
    db.createIndex( {x: 1, y: 1} )   //Indeks ini tidak tepat karena sejumlah besar data memiliki nilai yang sama dengan bidang x.
    db.createIndex( {y: 1 } )        //Indeks ini tepat karena sejumlah kecil data memiliki nilai yang sama dengan bidang y.
    db.createIndex( {y: 1, x: 1 } )  //Indeks ini tepat karena sejumlah kecil data memiliki nilai yang sama dengan bidang y.
    Catatan

    Untuk informasi lebih lanjut tentang perbedaan antara indeks {y: 1} dan {y: 1, x: 1}, lihat Prinsip Desain Indeks MongoDB dan Indeks Komposit.

  • Pengurutan sejumlah besar data (kata kunci: SORT dan hasSortStage)

    Nilai bidang hasSortStage adalah true saat kueri berisi urutan pengurutan. Jika kueri tidak dapat menggunakan indeks untuk mengembalikan hasil yang diurutkan sesuai permintaan, instance harus mengurutkan hasil kueri. Operasi pengurutan dapat menyebabkan pemanfaatan CPU tinggi. Sebagai tanggapan atas masalah ini, Anda dapat membuat indeks pada bidang yang sering diurutkan untuk mengoptimalkan kinerja pengurutan.

    Catatan

    Jika Anda menemukan kata kunci SORT dalam log kueri lambat, Anda dapat menggunakan indeks untuk mengoptimalkan kinerja pengurutan.

Operasi lain seperti pembuatan indeks dan aggregation (kombinasi dari traverse, query, update, dan sort) juga dapat menyebabkan pemanfaatan CPU tinggi. Anda juga dapat menggunakan metode pemecahan masalah yang disebutkan sebelumnya.

Evaluasi kemampuan layanan

Setelah Anda menganalisis dan mengoptimalkan permintaan yang sedang berjalan dan permintaan lambat di instance, semua permintaan sudah sesuai dan menggunakan indeks secara efisien. Jika sumber daya CPU masih sepenuhnya digunakan, instance mungkin telah mencapai kemampuan maksimum. Dalam hal ini, kami sarankan Anda menggunakan metode berikut untuk mengatasi masalah ini:

  1. Lihat data pemantauan untuk menganalisis penggunaan sumber daya instance. Untuk informasi lebih lanjut, lihat Lihat Data Pemantauan dan Pemantauan Node (sebelumnya Pemantauan Dasar).

  2. Periksa apakah instance memenuhi persyaratan performa dan kemampuan skenario bisnis Anda.

Untuk informasi lebih lanjut tentang cara meningkatkan instance, lihat Ubah Konfigurasi Instance atau Ubah Konfigurasi Instance Set Replika.