

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

# Kueri Berjalan Panjang
<a name="anti-pattern-long-running-queries"></a>

## Ikhtisar
<a name="long-queries-overview"></a>

Long-running kueri dapat mengalir ke masalah kinerja di seluruh klaster. Kueri ini dapat mengganggu proses pengumpulan sampah Multi-Version Concurrency Control (MVCC) Amazon DocumentDB, yang menyebabkan akumulasi dokumen berversi lama dan penurunan kinerja di seluruh cluster. Amazon DocumentDB menerapkan batas waktu sisi server 2 jam sebagai mekanisme keamanan untuk membatasi kueri pelarian dari mengkonsumsi sumber daya tanpa batas waktu.

**Apa itu Kueri yang berjalan lama:**
+ Kueri yang dijalankan untuk waktu yang lama (biasanya> 30 menit)
+ Buka kursor yang tetap aktif selama berjam-jam (waktu habis 2 jam tidak akan berlaku jika kursor aktif)

## Dampak pada cluster
<a name="long-queries-impact"></a>

**Kueri yang berjalan lama dapat mengganggu Proses pengumpulan Sampah**
+ **Versi Lama Akumulasi**: Pengumpul sampah tidak dapat merebut kembali versi dokumen lama
+ **Collection and Index Bloat**: Entri Collection and Index terakumulasi dari waktu ke waktu, kembung meningkat dan yang dapat menghasilkan lebih banyak biaya penyimpanan.
+ **CPU dan Tekanan Memori**: CPU dan tekanan memori meningkat karena pemrosesan yang tidak efisien dari peningkatan jumlah versi dokumen lama, entri indeks, dan ID transaksi yang tidak efisien.

Kueri Berjalan Panjang → Memblokir GC → Pertumbuhan Penyimpanan → CPU dan Tekanan Memori → Kueri Lebih Panjang

## Memantau dan mendeteksi
<a name="long-queries-monitoring"></a>

**1. Untuk menemukan kueri yang berjalan lama, gunakan perintah CurrenTop.**

```
// To find a query running for more than 30 mins
db.adminCommand({
    aggregate: 1,
    pipeline: [
        {$currentOp: {}},
        {$match: 
            {$or: 
                [{secs_running: {$gt: 1800}},
                 {WaitState: {$exists: true}}]}}],
    cursor: {}
});
```

**2. Untuk menemukan kursor yang aktif selama lebih dari 30 menit**

```
// To find cursor which is running more than 30 mins
db.adminCommand({
    "currentOp": true,
    "active": true,
    "$all": true
}).inprog.filter(function(op) {
    return op.desc == "Cursor" && 
           op.secs_running > 1800 && 
           op.active == true;
}).sort((a, b) => b.microsecs_running - a.microsecs_running)
```

**3. Memantau kemajuan pengumpul sampah melalui CloudWatch**

`LongestRunningGCProcess`— Durasi dalam hitungan detik dari proses pengumpulan sampah aktif terpanjang. Memperbarui setiap menit dan hanya melacak operasi aktif, tidak termasuk proses yang selesai dalam jendela satu menit.

`AvailableMVCCIds`-Penghitung yang menunjukkan jumlah operasi penulisan yang tersisa yang tersedia sebelum mencapai nol. Saat penghitung ini mencapai nol, klaster Anda memasuki mode hanya-baca hingga ID direklamasi dan didaur ulang. Penghitung berkurang dengan setiap operasi penulisan dan meningkat saat pengumpulan sampah mendaur ulang ID MVCC lama.

**catatan**  
ID MVCC yang lebih rendah dan durasi pengumpulan sampah yang diperpanjang tidak secara eksklusif dikaitkan dengan kueri yang berjalan lama. Write-intensive beban kerja pada instans yang dibatasi sumber daya juga dapat mengakibatkan berkurangnya ketersediaan ID MVCC dan siklus pengumpulan sampah yang berkepanjangan.

## Strategi Remediasi
<a name="long-queries-remediation"></a>
+ Menerapkan batas waktu kueri dalam aplikasi
+ Jangan biarkan kursor tetap hidup untuk jangka waktu yang lebih lama
+ Optimalkan kueri untuk kinerja yang lebih baik.
+ Lebih suka pengelompokan operasi tulis