View a markdown version of this page

Kueri Berjalan Lambat - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Kueri Berjalan Lambat

Identifikasi - Temukan masalahnya

Kueri yang berjalan lambat adalah kueri yang melebihi waktu eksekusi yang diharapkan untuk kebutuhan bisnis Anda. Definisi dari apa yang merupakan kueri lambat bervariasi di seluruh beban kerja yang berbeda. Anda dapat mengidentifikasi kueri lambat melalui log profiler atau Performance Insights.

  1. Aktifkan profiler jika belum diaktifkan. Log profiler ditulis ke Amazon CloudWatch di bawah Grup Log:/aws/docdb/<cluster-identifier>/profiler. Gunakan Wawasan CloudWatch Log untuk menanyainya.

    Contoh kueri analisis CloudWatch log untuk mendapatkan 10 kueri paling lambat untuk koleksi ecommerce.products:

    filter ns="ecommerce.products" | sort millis desc | limit 10
  2. Gunakan Performance Insights untuk mengidentifikasi kueri mahal dalam waktu dekat. Aktifkan Performance Insights jika belum diaktifkan.

    1. Buka AWS Konsol, navigasikan ke Amazon Amazon DocumentDB, lalu Performance Insights, dan pilih instance cluster Anda.

    2. Tinjau timeline DB Load (AAS) dan Kueri Top (berdasarkan beban DB). Perluas intisari kueri untuk melihat pernyataan turunan literal.

    3. Tangkap kueri yang membutuhkan analisis.

    catatan

    Tidak semua kueri dalam Performance Insights mungkin merupakan kueri yang tidak efisien atau lambat.

Selidiki - Kumpulkan informasi

  1. Profiler menyediakan rencana eksekusi kueri dan metrik kunci yang terkait dengannya, termasuk millis, nreturned, dan planSummary (penggunaan indeks):

    { "op": "query", "ts": 1721374275673, "ns": "test.perf", "command": { "find": "perf", "filter": { "threadRunCount": 0 }, "$db": "test", "lsid": { "id": { "$binary": "oO2wEtpgQIK+y9KGByYnsw==", "$type": "4" } }, "$readPreference": { "mode": "secondaryPreferred" } }, "cursorExhausted": true, "nreturned": 0, "responseLength": 0, "protocol": "op_query", "millis": 137, "planSummary": "IXSCAN", "execStats": { "stage": "FETCH", "nReturned": "0", "executionTimeMillisEstimate": "100.346", "inputStage": { "stage": "IXSCAN", "nReturned": "0", "executionTimeMillisEstimate": "100.342", "indexName": "threadRunCount_1" } }, "client": "172.31.6.165:43154", "appName": "ProdAppTester14", "user": "adminuser" }

    Untuk menemukan pertanyaan COLLSCAN:

    filter planSummary="COLLSCAN" | sort millis desc | limit 20
  2. Gunakan Performance Insights untuk menganalisis tren eksekusi kueri, seperti menunggu, memuat, dan dampak sumber daya (misalnya, IOPS atau CPU per kueri) secara real time.

    Karena Performance Insights tidak menyediakan paket eksekusi kueri, ambil kueri dan jalankan penjelasan (“ExecutionStats”) pada kueri di klaster Amazon DocumentDB Anda:

    db.ecommerce.products.find().explain("executionStats")
  3. Secara opsional, korelasikan metrik profiler dengan data Performance Insights (misalnya, mencocokkan kueri millis tinggi di profiler dengan kueri teratas di Performance Insights).

Diagnosa — Temukan akar penyebab

Pada langkah ini, diagnosa rencana kueri untuk mengidentifikasi potensi pengoptimalan. Gunakan aliran berikut - gejala → kemungkinan penyebabnya:

  • Gejala: PlanSummary: “COLLSCAN”

    Penyebab: Indeks hilang atau salah.

  • Gejala: agregasi lambat dengan $group/$sort

    Penyebab: Pipa agregasi mungkin memproses terlalu banyak data dalam memori.

  • Gejala: latensi tinggi sementara Performance Insights menunjukkan DB Load dikelompokkan berdasarkan IO waits, meskipun indeks digunakan (PlanSummary: “IXSCAN”).

    Penyebab: kueri I/O terikat; indeks atau set kerja melebihi cache buffer yang tersedia pada instance.

  • Gejala: PI menunjukkan status menunggu CPU, AAS tinggi karena beberapa kueri

    Penyebab: Kueri terikat CPU (agregasi kompleks, $regex).

  • Gejala: banyak kueri lambat tetapi tidak ada yang menunjukkan PlanSummary yang mahal

    Penyebab: kemacetan eksternal (jaringan, pelambatan, tugas pemeliharaan, volume kueri).

Selesaikan — Perbaiki masalah

Saat Anda menerapkan perbaikan, selalu validasi dengan explain (“ExecutionStats”) dan pantau Performance Insights DB Load.

  1. PlanSummary: “COLLSCAN”

    • Buat indeks yang ditargetkan.

      Contoh: Untuk kueri yang sering memfilter berdasarkan {kategori, harga} dan mengurutkan berdasarkan harga turun:

      db.products.createIndex({ category: 1, price: -1 })
  2. agregasi lambat dengan $group/$sort

    • Dorong $match dan $project lebih awal untuk mengurangi dokumen yang mengalir ke $group/$sort.

    • Batasi jumlah bidang di awal pipa:

      db.products.explain("executionStats").aggregate([ { $match: { category: "Electronics", price: { $gt: 0 } } }, // early filter { $project: { price: 1, category: 1 } }, // reduce document size { $group: { _id: "$category", avgPrice: { $avg: "$price" } } } ])
  3. latensi tinggi sementara Performance Insights menunjukkan DB Load dikelompokkan berdasarkan IO waits

    • Validasi BufferCacheHitRatio jika rendah atau ReadiOps pada instance tinggi. Tingkatkan memori instance (tingkatkan kelas instance, misalnya, r6g.large → r6g.xlarge) atau gunakan kelas instance. NVMe

    • Kurangi jejak indeks.

    • Tambahkan replika baca untuk membongkar lalu lintas baca (gunakan pengaturan ReadPreference untuk mengarahkan lalu lintas pada replika jika kueri toleran dengan konsistensi akhirnya).

  4. PI menunjukkan status menunggu CPU, AAS tinggi karena beberapa kueri

    • Ganti $regex yang mahal dengan pencarian awalan yang diindeks atau indeks $text.

    • Batch write (insert) untuk mengurangi amplifikasi tulis.

catatan

Selalu uji perubahan Anda di lingkungan yang lebih rendah (non-produksi) sebelum mempromosikan perubahan tersebut ke Produksi.