Processor splitting work into parallel lanes, representing SQL Server MAXDOP and cost threshold for parallelism

SQL Server MAXDOP ve Cost Threshold for Parallelism: Önerilen Ayarlar

MAXDOP ve cost threshold for parallelism’in birlikte nasıl çalıştığı, NUMA yapısına göre Microsoft’un MAXDOP önerileri, cost threshold seçimi, CXPACKET beklemeleri ve DOP feedback.

Aralık 15, 2021

SQL Server büyük bir sorguyu birden fazla CPU çekirdeğine bölerek çalıştırabilir. Doğru sorguda bu, dakikaları saniyelere indirir. Yanlış ayarlarla ise küçük sorgular da gereksiz yere paralel çalışır, çekirdekler birbirini bekler, CPU kullanımı yükselir ve aynı anda çalışabilen sorgu sayısı düşer. Paralelliği iki sunucu ayarı yönetir: max degree of parallelism (MAXDOP) ve cost threshold for parallelism (CTFP).

Bu rehberde iki ayarın ne yaptığını, Microsoft’un MAXDOP önerilerini, CTFP için makul bir başlangıç değerini nasıl bulacağınızı, CXPACKET beklemelerinin ne anlama geldiğini ve ayarları sunucu dışında hangi düzeylerde değiştirebileceğinizi anlatıyoruz.

SQL Server Performans Danışmanlığı

CPU kullanımınız neden bu kadar yüksek?

Aryasoft; paralellik ayarlarını, bekleme istatistiklerini ve pahalı sorguları birlikte inceler, CPU kullanımını ölçülebilir şekilde düşürür.

Destek Alın

İki Ayar, İki Soru

  • Cost threshold for parallelism “bu sorgu paralel çalışmaya değer mi?” sorusunu yanıtlar. Optimizer’ın tahmini maliyeti bu değerin üzerindeki sorgular için paralel plan değerlendirilir. Varsayılan değer 5’tir.
  • Max degree of parallelism “paralel çalışırsa en fazla kaç çekirdek kullanabilir?” sorusunu yanıtlar. Varsayılan değer 0’dır; yani SQL Server kullanılabilir tüm işlemcileri (en fazla 64) kullanabilir.

İki ayar birlikte düşünülmelidir. CTFP çok düşükse, tek çekirdekte milisaniyede bitecek küçük sorgular da paralel plana geçer. MAXDOP çok yüksekse, tek bir paralel sorgu sunucunun tüm çekirdeklerini meşgul eder ve diğer kullanıcılar bekler.

MAXDOP: Microsoft’un Önerileri

SQL Server 2016 ve sonrası için Microsoft’un önerisi, paralel bir sorgunun tüm worker’larını aynı NUMA düğümünde tutmayı hedefler:

Sunucu yapısı Mantıksal işlemci sayısı Öneri
Tek NUMA düğümü 8 veya daha az MAXDOP, mantıksal işlemci sayısını aşmasın
Tek NUMA düğümü 8’den fazla MAXDOP 8
Birden fazla NUMA düğümü NUMA düğümü başına 16 veya daha az MAXDOP, düğüm başına mantıksal işlemci sayısını aşmasın
Birden fazla NUMA düğümü NUMA düğümü başına 16’dan fazla Düğüm başına mantıksal işlemcinin yarısı, en fazla 16

Buradaki NUMA düğümü, SQL Server 2016 ve sonrasında otomatik oluşturulan soft-NUMA düğümleridir. SQL Server 2019 ve sonrasında kurulum sihirbazı, işlemci sayısına göre bir MAXDOP değeri önerir; çoğu kurulumda bu öneriyi kabul etmek iyi bir başlangıçtır. Azure SQL Database ve Azure SQL Managed Instance’ta yeni veritabanları için varsayılan değer zaten 8’dir.

Sunucunuzun NUMA yapısını görmek için:

SELECT node_id, memory_node_id, online_scheduler_count, cpu_count
FROM sys.dm_os_nodes
WHERE node_state_desc = N'ONLINE';

Cost Threshold for Parallelism: Varsayılan 5 Neden Düşük?

CTFP’nin varsayılan değeri 5, onlarca yıl önceki donanıma göre belirlenmiştir ve bugünün sunucularında birçok küçük sorgunun gereksiz yere paralel çalışmasına yol açar. Bu değer saniye değil, optimizer’ın kendi maliyet birimidir.

Microsoft tek bir değer önermez. Sahada yaygın yaklaşım, 30 ile 50 arasında bir değerle başlamak ve ardından iş yüküne göre ayarlamaktır. Daha isabetli bir başlangıç için plan cache’teki paralel planların maliyet dağılımına bakabilirsiniz:

-- Plan cache'teki paralel planların tahmini maliyet dağılımı
WITH XMLNAMESPACES (DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT TOP (50)
       n.value(N'@StatementSubTreeCost', N'float') AS estimated_cost,
       qs.execution_count,
       qs.total_worker_time / qs.execution_count / 1000 AS avg_cpu_ms,
       SUBSTRING(st.text, 1, 200) AS query_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY qp.query_plan.nodes(N'//StmtSimple') AS s(n)
WHERE qp.query_plan.exist(N'//RelOp[@Parallel = "1"]') = 1
ORDER BY qs.execution_count DESC;

Çok sık çalışan, maliyeti düşük ve paralel plan kullanan sorgular, CTFP’nin artırılması gerektiğinin işaretidir. Bu sorgu plan cache’i taradığı için büyük ve yoğun sunucularda sakin bir saatte çalıştırın.

Ayarları Değiştirmek

EXEC sys.sp_configure N'show advanced options', 1;
RECONFIGURE;

EXEC sys.sp_configure N'max degree of parallelism', 8;
EXEC sys.sp_configure N'cost threshold for parallelism', 50;
RECONFIGURE;

SELECT name, value_in_use
FROM sys.configurations
WHERE name IN (N'max degree of parallelism', N'cost threshold for parallelism');

İki ayar da yeniden başlatma gerektirmez ve hemen geçerli olur. Ancak değişiklik plan cache’i temizler; sorgular bir süre yeniden derleneceği için değişikliği yoğun saat dışında yapın ve sonrasında CPU ile bekleme istatistiklerini izleyin.

Uyarı

Yüksek CXPACKET beklemelerini görüp MAXDOP’u sunucu genelinde 1 yapmak sık yapılan bir hatadır. Bu, paralelliği tamamen kapatır; büyük raporlar, index bakımı ve DBCC CHECKDB gibi işlemler dramatik şekilde yavaşlar. Önce CTFP’yi ve MAXDOP’u önerilen aralığa getirin, ardından paralel çalışan pahalı sorguların index ve sorgu tasarımına bakın.

CXPACKET ve CXCONSUMER Beklemeleri

Paralel bir sorgu çalıştığında thread’ler birbirini bekler ve bu beklemeler CXPACKET ve CXCONSUMER olarak görünür. Bu beklemelerin varlığı tek başına sorun değildir; paralelliğin doğal bir sonucudur. CXCONSUMER genellikle zararsızdır. Dikkat edilmesi gereken durum, CXPACKET‘in toplam beklemelerin büyük bölümünü oluşturması ve buna yüksek CPU ile düşük eşzamanlılığın eşlik etmesidir; bu genellikle eşit dağılmayan iş yükünü, eksik index’leri ya da güncel olmayan istatistikleri işaret eder.

Sunucu Dışındaki Ayar Düzeyleri

MAXDOP yalnızca sunucu düzeyinde ayarlanmaz; daha dar kapsamlı ayarlar sunucu ayarını geçersiz kılar:

  • Veritabanı düzeyi: ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 4; Aynı sunucuda OLTP ve raporlama veritabanları farklı ihtiyaçlara sahipse kullanışlıdır.
  • Sorgu düzeyi: OPTION (MAXDOP 1) sorgu ipucu ya da kodu değiştirmeden Query Store hint’leri.
  • İş yükü düzeyi: Resource Governor workload group’larının MAX_DOP seçeneği; SQL Server 2025 ile Standard edition’da da kullanılabilir.
  • Index işlemleri: ALTER INDEX ... REBUILD WITH (MAXDOP = 4); değer yalnızca o işlem için geçerlidir.

Not

SQL Server 2022 ile gelen DOP feedback, tekrar eden sorgularda paralelliğin verimsiz olduğunu tespit edip bir sonraki çalıştırmada derecesini otomatik olarak düşürebilir. Compatibility level 160 veya üzerini ve Query Store’u gerektirir; SQL Server 2022’de varsayılan olarak kapalıdır ve ALTER DATABASE SCOPED CONFIGURATION SET DOP_FEEDBACK = ON ile açılır.

Paralellik Kontrol Listesi

  • MAXDOP, NUMA yapısına göre Microsoft önerileriyle uyumlu; 0 bırakılmamış.
  • CTFP varsayılan 5’ten yükseltilmiş ve plan cache maliyetlerine göre doğrulanmış.
  • Sunucu genelinde MAXDOP 1 kullanılmıyor; gereken yerde veritabanı ya da sorgu düzeyinde ayar var.
  • Değişiklik öncesi ve sonrası CPU ve bekleme istatistikleri karşılaştırıldı.
  • Yüksek CXPACKET görülen sorgularda index ve istatistik durumu incelendi.
Tek NUMA düğümlü ve 8’den fazla mantıksal işlemcili sunucularda 8; birden fazla NUMA düğümünde düğüm başına mantıksal işlemci sayısı (16’yı aşıyorsa yarısı, en fazla 16). 8 veya daha az işlemcide işlemci sayısını aşmayan bir değer.
Microsoft tek bir değer önermez. Varsayılan 5 bugünün donanımı için düşüktür; sahada genellikle 30-50 arasında başlanır ve plan cache’teki paralel planların maliyetine göre ayarlanır.
Hayır. sp_configure ile yapılan değişiklik hemen geçerli olur, ancak plan cache temizlenir.
Tek başına değildir; paralel sorguların doğal bir parçasıdır. Toplam beklemelerin büyük kısmını oluşturuyor ve yüksek CPU ile birlikte görülüyorsa paralellik ayarlarını ve sorgu tasarımını inceleyin.

SQL Server Performans Danışmanlığı

Paralelliği iş yükünüze göre ayarlayın

Aryasoft’un kıdemli DBA ekibi NUMA yapısını, bekleme istatistiklerini ve plan cache’i birlikte inceler; MAXDOP ve cost threshold değerlerini ölçüme dayanarak belirler ve sonucu yoğun saatlerde doğrular.

4.7/5