SQL Server performansını doğrudan etkileyen en kritik ayarlardan biri MAXDOP (Maximum Degree of Parallelism) değeridir. Bu ayar, SQL Server’ın bir sorguyu işlerken kaç işlemciyi (logical processor) paralel kullanabileceğini belirler. Yanlış yapılandırılmış bir MAXDOP değeri;
- Gereksiz CPU tüketimine,
- Yavaşlayan sorgulara,
- Sistem genelinde dengesiz kaynak kullanımına yol açabilir.
Microsoft, SQL Server 2016 sürümünden itibaren bu ayar için daha net ve kural bazlı bir rehber sunmaya başlamıştır. Artık MAXDOP ayarı belirlenirken NUMA (Non-Uniform Memory Access) mimarisi ve işlemci sayısı temel alınmaktadır.
NUMA (Non-Uniform Memory Access) Nedir?
NUMA modern sunucu mimarisinde kullanılan bir bellek erişim modelidir.
- Geleneksel sistemlerde (UMA – Uniform Memory Access) tüm işlemciler aynı bellek havuzuna eşit hızla erişirdi. Ancak işlemci sayısı arttıkça bu yapı darboğaz yaratmaya başladı.
- NUMA ile bu sorun çözülür:
- Sunucu, NUMA node denilen bölümlere ayrılır.
- Her NUMA node, kendi işlemcilerine (CPU core) ve RAM’ine sahiptir.
- İşlemciler kendi belleğine hızlı erişir, ancak diğer node’lardaki belleğe erişirken gecikme yaşar.
Yani NUMA çok işlemcili sistemlerde performans optimizasyonu için kullanılan bir donanım mimarisidir.
MAXDOP (Maximum Degree of Parallelism) Nedir?
MAXDOP SQL Server’daki bir ayardır ve “bir sorguyu işlerken en fazla kaç işlemci (CPU core) paralel kullanılabilir?” sorusunun cevabıdır.
- SQL Server büyük sorguları işlerken paralel çalıştırma (parallel execution) yapabilir.
- Çok fazla CPU kullanılırsa sorgu performansı artmaz, tam tersine koordinasyon yükü artar ve sistem yavaşlar.
- Çok az CPU kullanılırsa paralel işlem avantajı kaybolur.
İşte bu dengeyi kurmak için MAXDOP ayarı yapılır.
NUMA ve MAXDOP Arasındaki İlişki
- SQL Server paralel sorguları işlerken NUMA mimarisini dikkate alır.
- Eğer MAXDOP değeri bir NUMA node içindeki işlemci sayısından fazla olursa sorgular farklı node’lara yayılabilir → bu da bellek gecikmelerine ve performans kayıplarına yol açar.
- Bu nedenle Microsoft, MAXDOP değerinin belirlenmesinde NUMA node başına işlemci sayısını temel almayı önerir.
MAXDOP Ayarını Etkileyen Faktörler
MAXDOP değeri belirlenirken üç ana kriter göz önünde bulundurulmalıdır:
- Sunucu Yapısı
- Tek NUMA node (Single NUMA Node)
- Birden fazla NUMA node (Multiple NUMA Nodes)
- Mantıksal İşlemci Sayısı (Logical Processors)
- Bir NUMA node başına düşen işlemci sayısı
- Microsoft’un Sınır Önerileri
- Tek NUMA’da maksimum 8
- Çoklu NUMA’da maksimum 16
Microsoft’un Resmi Önerileri
Tek NUMA Node (Single NUMA Node)
- 8 işlemciye kadar:
MAXDOP değeri işlemci sayısına eşit veya daha düşük olmalı.- Örnek: 6 işlemci → MAXDOP ≤ 6
- 8 işlemciden fazla:
MAXDOP sabit olarak 8 olmalı.- Örnek: 24 işlemci → MAXDOP = 8
Birden Fazla NUMA Node (Multiple NUMA Nodes)
- 16 işlemciye kadar / NUMA node:
MAXDOP, node içindeki işlemci sayısına eşit veya daha düşük olmalı.- Örnek: 12 işlemci per node → MAXDOP ≤ 12
- 16 işlemciden fazla / NUMA node:
MAXDOP, işlemci sayısının yarısı olarak ayarlanmalı, ancak en fazla 16 olacak şekilde sınırlanmalı.- Örnek: 32 işlemci per node → MAXDOP = 16
- Microsoft varsayılan olarak MAXDOP = 8 kullanılmasını tavsiye eder.
- Ancak büyük NUMA node yapılarında 16’ya kadar çıkmak mümkündür.
- MAXDOP’un 1 yapılması ise yalnızca seri iş yüklerinde tercih edilmelidir (ör. OLTP sistemlerinde belirli durumlarda).
Örnek Senaryolar
- 1 NUMA, 6 CPU: MAXDOP = 6
- 1 NUMA, 24 CPU: MAXDOP = 8
- 2 NUMA, 12 CPU/node: MAXDOP = 12
- 2 NUMA, 32 CPU/node: MAXDOP = 16
Kendi Sisteminizde Önerilen MAXDOP Değerini Bulma
SQL Server üzerinde işlemci ve NUMA yapısını öğrenmek için aşağıdaki sorguyu kullanabilirsiniz:
SELECT
cpu_count AS [Toplam CPU],
hyperthread_ratio AS [Hyperthread Oranı],
scheduler_count AS [Scheduler Sayısı],
numa_node_count AS [NUMA Node Sayısı]
FROM sys.dm_os_sys_info;
Bu bilgileri aldıktan sonra Microsoft’un önerilerini uygulayarak doğru MAXDOP değerini belirleyebilirsiniz.
SQL Server 2016 ve üzerindeki sürümlerde MAXDOP ayarı artık rastgele belirlenen bir parametre değil işlemci mimarisi ve NUMA yapısına göre optimize edilen bir değerdir.
- Test ve küçük sistemler için: işlemci sayısına göre ayar yapılmalı.
- Büyük, çok işlemcili NUMA sistemlerinde: yarıya bölünerek 16 sınırı aşılmamalı.
- Varsayılan güvenli değer: MAXDOP = 8.
Doğru yapılandırılmış bir MAXDOP değeri, sistemin daha verimli çalışmasını, kaynakların dengeli kullanılmasını ve sorgu performansının iyileşmesini sağlar.
Bu Konuda Microsoft Önerisi;
- Tek NUMA node ve ≤ 8 CPU: MAXDOP = CPU sayısı
- Tek NUMA node ve > 8 CPU: MAXDOP = 8
- Çok NUMA node ve ≤ 16 CPU/node: MAXDOP = CPU sayısı (node başına)
- Çok NUMA node ve > 16 CPU/node: MAXDOP = CPU sayısının yarısı, en fazla 16
Benim Önerim (Gerçek Hayat Pratikleri)
OLTP Sistemleri (Transaction yoğun, küçük sorgular, bankacılık vb.)
- Burada çok büyük paralelleştirme gerekmez.
- Önerim: MAXDOP = 4 veya 8
- Ama hiçbir zaman node başına CPU sayısını geçme.
OLAP / Raporlama Sistemleri (Büyük sorgular, veri ambarı, analitik)
- Büyük sorgular çok CPU kullanmaktan fayda sağlar.
- Önerim: Microsoft’un tablodaki kuralına uymak gerekirse 12-16’ya kadar çıkabilirsin.
Karma Sistemler (Hem OLTP hem raporlama)
- Burada en güvenli ayar genelde MAXDOP = 8 olur.
- Çünkü OLTP’yi de OLAP’i de fazla zorlamaz.
Cost Threshold for Parallelism’i Unutmamak
Birçok kişi sadece MAXDOP’u ayarlıyor ama Cost Threshold for Parallelism (CTFP) ayarını gözden kaçırıyor.
- Varsayılan değer 5’tir (çok düşüktür!).
- Bu durumda gereksiz küçük sorgular bile paralelleşmeye gider → CPU boşa yorulur.
- Önerim: CTFP değerini 30 – 50 aralığına yükseltmek