Perlu memahami kesalahan eksekusi permintaan paralel

18

Hari ini kami mengalami penurunan kinerja pada server sql produksi kami. Selama waktu ini terjadi, kami mencatat beberapa "The query processor could not start the necessary thread resources for parallel query execution"kesalahan. Pembacaan yang telah saya lakukan menunjukkan bahwa ini ada hubungannya dengan berapa banyak CPU untuk digunakan ketika menjalankan query yang kompleks. Namun ketika saya memeriksa selama pemadaman kami CPU Utilization was only at 7%. Apakah ada hal lain yang bisa merujuk juga yang belum saya temui? Apakah ini kemungkinan penyebab penurunan kinerja atau apakah saya mengejar ikan haring merah?

Nilai sp_configure saya untuk ini adalah sebagai berikut:

name                                minimum maximum config_value run_value
cost threshold for parallelism      0       32767   5            5
Kental
sumber
Apa nilai dari max degree of parallelismkonfigurasi dan berapa banyak prosesor yang Anda miliki saat ini di server bersama dengan konfigurasi NUMA? Anda dapat menggunakan coreinfo.exedari Sysinternals untuk mengetahui jumlah prosesor dan konfigurasi NUMA.
Kin Shah
Max Degree of Parallelism diatur ke 0
Lumpy
Itu menjelaskan mengapa sql server akan kelaparan untuk sumber daya thread.
Kin Shah
@Kin Saya punya 12 prosesor (0 - 11) prosesor kemudian dua prosesor logis untuk NUMA Node peta: entri Node 0, Node 1
Lumpy
@ Saya pikir 0 ment bahwa SQL Server mengatur berapa banyak thread yang seharusnya digunakan. Mengapa ini mengakibatkan kelaparan SQL Server untuk sumber daya utas?
Lumpy

Jawaban:

19

Beberapa bulan yang lalu, saya menghadapi situasi yang sama di mana pengaturan MAXDOP adalah default dan permintaan lari menghabiskan semua utas pekerja.

Seperti yang ditunjukkan Remus, ini disebut kelaparan pekerja .

Akan ada dump memori yang dibuat di server Anda ketika kondisi ini terjadi.

Jika Anda menggunakan 2008R2 + SP1 dan yang lebih tinggi maka sys.dm_server_memory_dumpsakan memberi Anda lokasi file dump juga.

Sekarang kembali ke masalah:

Ada 1 utas monitor penjadwal per simpul NUMA dan karena Anda memiliki 2 simpul NUMA akan ada 2 utas monitor penjadwal yang bertanggung jawab untuk pemeriksaan kesehatan semua penjadwal setiap 60 detik untuk simpul NUMA tertentu sambil memastikan bahwa penjadwal macet atau tidak.

Setiap kali permintaan kerja baru ditarik dari antrian pekerja penjadwal, penghitung proses kerja bertambah. Jadi, jika scheduler memiliki permintaan kerja yang antri dan belum memproses salah satu permintaan pekerjaan dalam 60 detik, scheduler dianggap macet.

Karena kueri run-away atau paralelisme yang luas, timbullah kondisi utas pekerja mulai habis karena semua utas ditempati oleh kueri pelarian tunggal atau pemblokiran berkepanjangan yang berlebihan dan tidak ada pekerjaan yang dapat dilakukan kecuali proses menyinggung itu terbunuh.

Taruhan terbaik Anda adalah menyetel terlebih dahulu pengaturan Max Degree of Parallelism Anda . Default 0 berarti SQL Server dapat menggunakan semua CPU yang tersedia untuk pemrosesan paralel dan di sana dengan melelahkan semua utas pekerja.

Ada banyak alasan yang dapat menyebabkan kelelahan pekerja:

  • Rantai pemblokiran panjang yang luas menyebabkan SQL Server kehabisan utas pekerja
  • Paralelisme yang luas juga menyebabkan kelelahan pada benang pekerja
  • Penantian luas untuk semua jenis "kunci" - spinlocks, kait. Spinlock yatim adalah contohnya.

Lihat jawaban saya di sini yang akan menunjukkan kepada Anda bagaimana Anda bisa menghitung nilai MAXDOP untuk contoh server Anda.

Juga, sangat menyarankan Anda untuk mulai mengumpulkan informasi Tunggu statistik tentang contoh server database Anda.

Kin Shah
sumber
apakah ada sesuatu yang akan menunjukkan permintaan menjalankan awway? Adakah yang bisa saya gunakan untuk mencoba mengidentifikasi pertanyaan yang berisiko terhadap ini?
Lumpy
Sarankan Anda untuk melihat info statistik tunggu untuk mengetahui di mana itu menyakitkan . Juga, lihat sys.dm_os_schedulers-> current_tasks_count, runnable_tasks_count, current_workers_count dan juga active_workers_count sys.dm_os_wait_statsdan dansys.dm_os_waiting_tasks
Kin Shah
10

Mungkin ada beberapa alasan. Kemungkinan besar adalah Anda kehabisan pekerja. Lihat max_worker_threads. Kondisi ini disebut 'kebuntuan pekerja'. Para pekerja dapat dicuri dengan salah satu dari banyak cara (tidak ada yang akan menghasilkan pemanfaatan CPU yang tinggi, btw), seperti memiliki banyak permintaan diblokir atau melakukan hal-hal bodoh di CLR (mis. Permintaan HTTP).

Gejala yang Anda lihat adalah korban masalahnya, bukan penyebabnya. Kami tidak dapat merekomendasikan solusi tanpa mengetahui penyebabnya. Anda perlu mengumpulkan penghitung perf, DMV dan memeriksa ERRORLOG untuk info lebih lanjut.

Remus Rusanu
sumber
utas pekerja maks Min = 128, maks = 32767, config = 0, jalankan = 0
Lumpy
2
@ Lumpy Itu maks konfigurasi Anda, tapi itu jauh dari pekerja maks yang sebenarnya. Kami perlu tahu berapa banyak prosesor yang harus dihitung mesin Anda.
Thomas Stringer