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
max degree of parallelism
konfigurasi dan berapa banyak prosesor yang Anda miliki saat ini di server bersama dengan konfigurasi NUMA? Anda dapat menggunakancoreinfo.exe
dari Sysinternals untuk mengetahui jumlah prosesor dan konfigurasi NUMA.Jawaban:
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_dumps
akan 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:
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.
sumber
sys.dm_os_schedulers
-> current_tasks_count, runnable_tasks_count, current_workers_count dan juga active_workers_countsys.dm_os_wait_stats
dan dansys.dm_os_waiting_tasks
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.
sumber