Praktik Terbaik untuk Kueri Paralel di PostgreSQL RDS untuk PostgreSQL - Layanan Basis Data Relasional Amazon

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

Praktik Terbaik untuk Kueri Paralel di PostgreSQL RDS untuk PostgreSQL

Eksekusi query paralel adalah fitur di PostgreSQL yang memungkinkan query SQL tunggal untuk dipecah menjadi tugas-tugas yang lebih kecil yang diproses secara bersamaan oleh beberapa proses pekerja latar belakang. Alih-alih mengeksekusi kueri sepenuhnya dalam satu proses backend, PostgreSQL dapat mendistribusikan bagian dari kueri, seperti pemindaian, gabungan, agregasi, atau penyortiran, di beberapa inti CPU. Proses pemimpin mengoordinasikan eksekusi ini dan mengumpulkan hasil dari pekerja paralel.

Namun, untuk sebagian besar beban kerja produksi, terutama sistem OLTP konkurensi tinggi, kami sarankan untuk menonaktifkan eksekusi kueri paralel otomatis. Meskipun paralelisme dapat mempercepat kueri pada kumpulan data besar dalam analitik atau pelaporan beban kerja, paralelisme menimbulkan risiko signifikan yang seringkali lebih besar daripada manfaatnya di lingkungan produksi yang sibuk.

Eksekusi paralel juga memperkenalkan overhead yang signifikan. Setiap pekerja paralel adalah proses backend PostgreSQL lengkap, yang membutuhkan proses forking (menyalin struktur memori dan menginisialisasi status proses) dan otentikasi (memakan slot koneksi dari batas Anda). max_connections Setiap pekerja juga mengkonsumsi memorinya sendiri, termasuk work_mem untuk operasi penyortiran dan hashing, dengan beberapa pekerja per kueri, penggunaan memori berlipat ganda dengan cepat (misalnya, 4 pekerja × 64MB work_mem = 256MB per kueri). Akibatnya, query paralel dapat mengkonsumsi sumber daya sistem yang jauh lebih banyak daripada kueri proses tunggal. Jika tidak disetel dengan benar, mereka dapat menyebabkan saturasi CPU (beberapa pekerja melebihi kapasitas pemrosesan yang tersedia), peningkatan peralihan konteks (sistem operasi sering beralih di antara banyak proses pekerja, menambahkan overhead dan mengurangi throughput), atau kelelahan koneksi (karena setiap pekerja paralel mengkonsumsi slot koneksi, satu kueri dengan 4 pekerja menggunakan total 5 koneksi, 1 pemimpin+4 pekerja, yang dapat dengan cepat menghabiskan kumpulan koneksi Anda di bawah konkurensi tinggi, mencegah yang baru koneksi klien dan menyebabkan kegagalan aplikasi). Masalah ini sangat parah di bawah beban kerja konkurensi tinggi di mana beberapa kueri dapat mencoba eksekusi paralel secara bersamaan.

PostgreSQL memutuskan apakah akan menggunakan paralelisme berdasarkan perkiraan biaya. Dalam beberapa kasus, perencana dapat secara otomatis beralih ke paket paralel jika tampak lebih murah bahkan ketika itu tidak ideal dalam praktiknya. Ini bisa terjadi jika statistik indeks sudah ketinggalan zaman atau jika bloat membuat pemindaian berurutan tampak lebih menarik daripada pencarian indeks. Karena perilaku ini, rencana paralel otomatis terkadang dapat memperkenalkan regresi dalam kinerja kueri atau stabilitas sistem.

Untuk mendapatkan manfaat maksimal dari query paralel di PostgreSQL RDS untuk PostgreSQL, penting untuk menguji dan menyetelnya berdasarkan beban kerja Anda, memantau dampak sistem, dan menonaktifkan pemilihan paket paralel otomatis demi kontrol tingkat kueri.

Parameter Konfigurasi

PostgreSQL menggunakan beberapa parameter untuk mengontrol perilaku dan ketersediaan query paralel. Memahami dan menyetel ini sangat penting untuk mencapai kinerja yang dapat diprediksi:

Parameter Deskripsi Default
max_parallel_workers Jumlah maksimum proses pekerja latar belakang yang dapat berjalan secara total TERBESAR ($ DBInstance VCPU/2,8)
max_parallel_workers_per_gather Jumlah maksimum pekerja per node rencana kueri (misalnya, perGather) 2
parallel_setup_cost Biaya perencana ditambahkan untuk memulai infrastruktur query paralel 1000
parallel_tuple_cost Biaya per tupel diproses dalam mode paralel (berdampak pada keputusan perencana) 0.1
force_parallel_mode Memaksa perencana untuk menguji rencana paralel (off,on,regress) off

Pertimbangan Utama

  • max_parallel_workersmengontrol total kumpulan pekerja paralel. Jika disetel terlalu rendah, beberapa kueri mungkin kembali ke eksekusi serial.

  • max_parallel_workers_per_gathermempengaruhi berapa banyak pekerja yang dapat digunakan oleh satu kueri. Nilai yang lebih tinggi meningkatkan konkurensi, tetapi juga penggunaan sumber daya.

  • parallel_setup_costdan parallel_tuple_cost mempengaruhi model biaya perencana. Menurunkan ini dapat membuat rencana paralel lebih mungkin untuk dipilih.

  • force_parallel_modeberguna untuk pengujian tetapi tidak boleh digunakan dalam produksi kecuali diperlukan.

catatan

Nilai default max_parallel_workers parameter dihitung secara dinamis berdasarkan ukuran instance menggunakan GREATEST($DBInstanceVCPU/2, 8) rumus. Ini berarti bahwa ketika Anda menskalakan Anda ke ukuran komputasi yang lebih besar dengan lebih banyak vCPUs, jumlah maksimum pekerja paralel yang tersedia akan meningkat secara otomatis. Akibatnya, kueri yang sebelumnya dijalankan secara serial atau dengan paralelisme terbatas tiba-tiba dapat memanfaatkan lebih banyak pekerja paralel setelah operasi peningkatan skala, berpotensi menyebabkan peningkatan tak terduga dalam penggunaan koneksi, pemanfaatan CPU, dan konsumsi memori. Penting untuk memantau perilaku query paralel setelah peristiwa penskalaan komputasi dan menyesuaikan max_parallel_workers_per_gather jika perlu untuk mempertahankan penggunaan sumber daya yang dapat diprediksi.

Identifikasi Penggunaan Kueri Paralel

Kueri dapat beralih ke paket paralel berdasarkan distribusi data atau statistik. Contoh:

SELECT count(*) FROM customers WHERE last_login < now() - interval '6 months';

Kueri ini mungkin menggunakan indeks untuk data terbaru, tetapi beralih ke pemindaian sekuensial paralel untuk data historis.

Anda dapat mencatat rencana eksekusi kueri dengan memuat auto_explain modul. Untuk mempelajari lebih lanjut, lihat Mencatat rencana eksekusi kueri di pusat AWS pengetahuan.

Anda dapat memantau Wawasan CloudWatch Database untuk peristiwa tunggu terkait Kueri Paralel. Untuk mempelajari lebih lanjut tentang peristiwa tunggu terkait Permintaan Paralel, buka acara tunggu IPC:Parallel

Dari PostgreSQL versi 18, Anda dapat memantau aktivitas pekerja paralel menggunakan kolom baru di dan: pg_stat_databasepg_stat_statements

  • parallel_workers_to_launch: Jumlah pekerja paralel yang direncanakan akan diluncurkan

  • parallel_workers_launched: Jumlah pekerja paralel yang benar-benar diluncurkan

Metrik ini membantu mengidentifikasi perbedaan antara paralelisme terencana dan aktual, yang dapat menunjukkan kendala sumber daya atau masalah konfigurasi. Gunakan kueri berikut untuk memantau eksekusi paralel:

Untuk metrik pekerja paralel tingkat Database:

SELECT datname, parallel_workers_to_launch, parallel_workers_launched FROM pg_stat_database WHERE datname = current_database();

Untuk metrik pekerja paralel tingkat kueri

SELECT query, parallel_workers_to_launch, parallel_workers_launched FROM pg_stat_statements ORDER BY parallel_workers_launched;

Cara Mengontrol Paralelisme

Ada beberapa cara untuk mengontrol paralelisme kueri, masing-masing dirancang untuk skenario dan persyaratan yang berbeda.

Untuk menonaktifkan paralelisme otomatis secara global, parameter Anda untuk disetel:

max_parallel_workers_per_gather = 0;

Untuk pengaturan persisten dan spesifik pengguna, perintah ALTER ROLE menyediakan cara untuk mengatur parameter yang akan berlaku untuk semua sesi future untuk pengguna tertentu.

Contoh:

ALTER ROLE username SET max_parallel_workers_per_gather = 4;memastikan bahwa setiap kali pengguna ini terhubung ke database, sesi mereka akan menggunakan pengaturan pekerja paralel ini bila diperlukan.

Kontrol tingkat sesi dapat dicapai dengan menggunakan perintah SET, yang memodifikasi parameter selama sesi database saat ini. Ini sangat berguna ketika Anda perlu menyesuaikan pengaturan sementara tanpa memengaruhi pengguna lain atau sesi future. Setelah disetel, parameter ini tetap berlaku hingga diatur ulang secara eksplisit atau sampai sesi berakhir. Perintahnya mudah:

SET max_parallel_workers_per_gather = 4; -- Run your queries RESET max_parallel_workers_per_gather;

Untuk kontrol yang lebih terperinci, SET LOCAL memungkinkan Anda memodifikasi parameter untuk satu transaksi. Ini sangat ideal ketika Anda perlu menyesuaikan pengaturan untuk serangkaian kueri tertentu dalam transaksi, setelah itu pengaturan secara otomatis kembali ke nilai sebelumnya. Pendekatan ini membantu mencegah efek yang tidak diinginkan pada operasi lain dalam sesi yang sama.

Mendiagnosis Perilaku Kueri Paralel

Gunakan EXPLAIN (ANALYZE, VERBOSE) untuk mengonfirmasi apakah kueri menggunakan eksekusi paralel:

  • Carilah node sepertiGather,Gather Merge, atauParallel Seq Scan.

  • Bandingkan rencana dengan dan tanpa paralelisme.

Untuk menonaktifkan paralelisme sementara untuk perbandingan:

SET max_parallel_workers_per_gather = 0; EXPLAIN ANALYZE <your_query>; RESET max_parallel_workers_per_gather;