Paralel sorgu yürütme hatasını anlamamız gerekiyor


18

Bugün üretim sql sunucumuzda performansta bir düşüş yaşadık. Bunun meydana geldiği süre içinde birkaç "The query processor could not start the necessary thread resources for parallel query execution"hata kaydettik. Yaptığım okuma, bunun karmaşık bir sorguyu yürütürken kaç CPU kullanılacağı ile ilgili olduğunu gösteriyor. Ancak ne zaman kesintisi sırasında kontrol bizim CPU Utilization was only at 7%. Bu henüz bahsetmediğim başka bir şey var mı? Bu, performans düşüşünün muhtemel bir suçlusu mu yoksa kırmızı bir ringa balığı mı takip ediyorum?

Bunun için sp_configure değerlerim aşağıdaki gibidir:

name                                minimum maximum config_value run_value
cost threshold for parallelism      0       32767   5            5

max degree of parallelismYapılandırılanın değeri nedir ve şu anda sunucuda NUMA yapılandırmasıyla birlikte kaç işlemciniz var? Sen kullanabilirsiniz coreinfo.exegelen sysinternals işlemcileri ve numa yapılandırma sayısını bulmak için.
Kin Shah

Maksimum Paralellik Derecesi 0 olarak ayarlanır
Lumpy

Bu sql sunucusunun iş parçacığı kaynakları için neden açlıktan öleceğini açıklıyor.
Kin Shah

@Kin NUMA Düğümü eşlemesine 12 işlemciden (0 - 11) sonra iki mantıksal işlemcim var: girişler Düğüm 0, Düğüm 1
Topaklı

@Kin 0'ın SQL Server'ın kaç tane iş parçacığı kullanması gerektiğini yönettiğini düşündüm. Bu neden iş parçacığı kaynakları için SQL Server açlıktan neden olur?
Lumpy

Yanıtlar:


19

Birkaç ay önce, MAXDOP ayarının varsayılan olduğu ve kaçan bir sorgunun tüm işçi iş parçacıklarını tükettiği benzer bir durumla karşılaştım.

Remus'un işaret ettiği gibi buna işçi ipliği açlığı denir .

Bu durum ortaya çıktığında sunucunuzda bir bellek dökümü oluşacaktır.

2008R2 + SP1 ve üstü sys.dm_server_memory_dumpsiseniz, döküm dosyası konumunu da verirsiniz.

Şimdi soruna geri dönelim:

NUMA düğümü başına 1 zamanlayıcı monitör iş parçacığı vardır ve 2 NUMA düğümünüz olduğundan, zamanlayıcının takılı kaldığından emin olurken belirli bir NUMA düğümü için her 60 saniyede bir tüm zamanlayıcıların sağlık denetiminden sorumlu 2 zamanlayıcı monitör iş parçacığı olacaktır. değil.

Zamanlayıcıların işçi kuyruğundan her yeni çalışma isteği alındığında, iş süreçleri sayacı artırılır. Dolayısıyla, zamanlayıcı iş isteği kuyruğa alınmışsa ve 60 saniye içinde çalışma isteklerinden birini işlemiyorsa, zamanlayıcı sıkışmış sayılır.

Bir kaçış sorgusu veya kapsamlı bir paralellik nedeniyle, tüm iş parçacıkları tek bir kaçış sorgusu veya aşırı uzun süreli engelleme tarafından işgal edildiğinden, iş parçacığıların tükenmeye başladığı bir durum ortaya çıkar ve rahatsız edici süreç öldürülmedikçe hiçbir iş yapılamaz.

En iyi seçeneğiniz, önce Maksimum Paralellik Derecesi ayarınızı ayarlamaktır. Varsayılan olarak 0 SQL Server, paralel işleme ve tüm çalışan iş parçacıklarını tüketerek kullanılabilir tüm CPU'ları kullanabilir.

İşçi ipliklerinin tükenmesine yol açabilecek birçok neden vardır:

  • SQL Server'ın çalışan iş parçacıklarının bitmesine neden olan kapsamlı uzun engelleme zincirleri
  • İşçi ipliklerinin tükenmesine yol açan kapsamlı paralellik
  • Her türlü "kilit" için kapsamlı bekleme - kilitler, mandallar. Öksüz kalmış bir spinlock buna bir örnektir.

Cevabım bakın burada size sunucu örneği için MAXDOP değerini hesaplamak nasıl göstereceğim söyledi.

Ayrıca, veritabanı sunucusu örneğiniz hakkında Bekleme istatistikleri bilgileri toplamaya başlamanızı kesinlikle öneririz .


çalışma yolu sorgusu göstergesi olacak bir şey var mı? Bu risk altında olan sorguları belirlemek için kullanabileceğim bir şey var mı?
Lumpy

Nerede acıttığını bulmak için bekleme istatistikleri bilgilerine bakmanızı öneririz . Ayrıca, -> current_tasks_count, runnable_tasks_count, current_workers_count ve active_workers_count'un yanı sıra vesys.dm_os_schedulerssys.dm_os_wait_statssys.dm_os_waiting_tasks
Kin Shah

10

Bunun birkaç nedeni olabilir. Büyük olasılıkla işçileriniz bitti. Bkz max_worker_threads. Bu duruma 'işçi sıkıntısı' denir. Çalışanlar, CLR'de çok sayıda isteğin engellenmesi veya aptalca şeyler (ör. HTTP istekleri) yapılması gibi birden fazla yoldan (hiçbiri yüksek CPU kullanımına yol açmayacak, btw) çalınabilir.

Gördüğünüz belirti sorunun değil, sorunun kurbanı. Nedeni bilmeden bir çözüm öneremeyiz. Daha fazla bilgi için mükemmel sayaçlar, DMV'ler toplamanız ve ERRORLOG'u kontrol etmeniz gerekir.


max işçi konuları Min = 128, max = 32767, yapılandırma = 0, çalıştırma = 0
Topaklı

2
@ Toplama Bu sizin yapılandırma maksiniz, ancak bu gerçek maksimum çalışanların yakınında değil. Makinenizin kaç işlemciyi hesaplaması gerektiğini bilmemiz gerekir.
Thomas Stringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.