Batasi derajat paralelisme (DOP) yang tersedia untuk permintaan apa pun

11

Pada Oracle Exadata (11gR2), kami memiliki basis data yang relatif gemuk.

  • cpu_count adalah 24
  • parallel_server_inances adalah 2
  • parallel_threads_per_cpu adalah 2

Kami mencatat, melalui pengamatan di Oracle Enterprise Manager (OEM), bahwa kinerja sangat buruk karena permintaan dieksekusi secara serial. Untuk mengatasi ini, semua tabel, pandangan terwujud dan indeks diubah untuk mengambil keuntungan dari paralelisme. misalnya:

ALTER TABLE SOME_TABLE PARALLEL (DEGREE DEFAULT INSTANCES DEFAULT);

Sistem diubah untuk mengaktifkan parallelisation:

ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = 'AUTO';

Ini menghasilkan kinerja yang lebih baik tetapi kadang-kadang kami mengamati di OEM bahwa satu permintaan akan mengikat DOP 96 (semua sumber daya yang tersedia). Ini mengakibatkan pertanyaan selanjutnya diturunkan ke DOP 1 (tidak ada parallelisation). Menghasilkan kinerja yang buruk sampai kueri memonopoli selesai.

Untuk mengatasi ini, kami mencoba membatasi DOP yang tersedia untuk permintaan apa pun dengan:

ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;

Ini tidak berpengaruh. Kami sering mengamati kueri yang akan menggunakan lebih dari batas (umumnya 48 atau 96, tetapi tidak ada pola nyata).

Bagaimana kami mencegah permintaan tunggal dari memonopoli semua sumber daya yang tersedia?

granat
sumber

Jawaban:

8

Set Server Paralel: PARALLEL_DEGREE_LIMIT membatasi tingkat paralelisme, tetapi jika kueri Anda mengurutkan atau mengelompokkan jumlah proses paralel dapat dua kali lipat (dua set server untuk memungkinkan paralelisme antar-proses). Itu menjelaskan mengapa Anda akan melihat 48 proses paralel bahkan dengan batas 24. Ini juga terjadi jika Anda menggunakan manajer sumber daya untuk membatasi DOP.

Petunjuk paralel: PARALLEL_DEGREE_LIMIT hanya berlaku untuk pernyataan yang menggunakan derajat paralelisme otomatis. Pernyataan apa pun yang menggunakan derajat kode-keras, atau bahkan segala jenis petunjuk paralel tingkat objek, akan mengabaikan batas. Jika Anda memiliki petunjuk itu, itu bisa menjelaskan mengapa Anda melihat 96 beberapa kali.

Mengkalibrasi IO: Mungkin DOP otomatis tidak digunakan, dan dengan demikian batasnya tidak diikuti, karena IO tidak dikalibrasi . Kueri ini akan memberi tahu Anda jika IO telah dikalibrasi:

select * from V$IO_CALIBRATION_STATUS;

Saya pernah melihat ini menyebabkan masalah sebelumnya, tetapi sistem saya saat ini tidak dikalibrasi dan DOP otomatis sepertinya berfungsi dengan baik. Anda dapat mengetahui apakah ini benar-benar masalah dengan melihat bagian Catatan pada rencana penjelasan. Jika Anda melihat sesuatu seperti - automatic DOP: Computed Degree of Parallelism is 2Anda baik-baik saja, tetapi Anda tidak ingin melihatnya automatic DOP: skipped because of IO calibrate statistics are missing.

Tingkatkan PARALLEL_MAX_SERVERS: Alih-alih khawatir kehabisan server paralel, saya sarankan Anda meningkatkan PARALLEL_MAX_SERVERS secara signifikan. Anda setidaknya harus mencoba untuk kembali ke nilai default , PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5, antara 240 dan 960 tergantung pada pengaturan memori Anda.

Angka-angka tinggi itu terdengar konyol bagi banyak DBA, tetapi mereka benar-benar masuk akal karena alasan berikut:

  • Server paralel Oracle lebih ringan dari yang diperkirakan kebanyakan orang. (Dan hampir tidak ada yang pernah mengujinya, mereka hanya menemukan satu situasi di mana DOP besar menyebabkan masalah dan menganggap bahwa DOP tinggi selalu buruk.)
  • Sudah biasa menjalankan kueri adhoc dalam alat GUI yang hanya mengambil 50 baris pertama, tetapi masih menggunakan puluhan server paralel. Kueri ini TIDAK mengkonsumsi sumber daya yang signifikan, kecuali PARALLEL_MAX_SERVERS terlalu rendah. Kemudian orang-orang dimarahi karena menjalankan pertanyaan yang masuk akal, yang dapat menyebabkan beberapa situasi buruk.
  • DOP yang sangat besar untuk satu permintaan tidak selalu buruk. Semua orang berasumsi bahwa jika Anda terus meningkatkan DOP, overhead akan menjadi terlalu tinggi dan kinerja akan turun secara signifikan. Tetapi pada banyak sistem saya telah menemukan bahwa bahkan DOP yang sangat tinggi akan menghasilkan kinerja yang lebih baik, meskipun pasti ada pengembalian yang menurun, dan itu bisa sangat tidak adil untuk sesi lain. Tapi jangan hanya menebak, coba saja; ambil kueri dan jalankan dengan semua jenis DOP, hingga 1000. Anda mungkin terkejut.
  • Ya, terlalu banyak paralelisme bisa jadi buruk. Tetapi apa yang lebih buruk untuk sistem, memiliki sedikit lebih banyak daripada jumlah sesi yang optimal, atau memaksakan permintaan serial dan pada dasarnya membunuh pekerjaan penting? Anda harus memantau sistem sebelum menerapkan batasan yang sewenang-wenang.
Jon Heller
sumber
Wow! Terima kasih, ada banyak hal untuk diperhatikan di sini dan saran yang sangat berguna.
granat