Saat menyiapkan SQL Server baru, saya menggunakan kode berikut untuk menentukan titik awal yang baik untuk MAXDOP
pengaturan:
/*
This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
configuration. You will need to evaluate this setting in a non-production
environment before moving it to production.
MAXDOP can be configured using:
EXEC sp_configure 'max degree of parallelism',X;
RECONFIGURE
If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1
(URL wrapped for readability)
http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx
Biztalk (all versions, including 2010):
MAXDOP = 1 is only required on the BizTalk Message Box
database server(s), and must not be changed; all other servers hosting other
BizTalk Server databases may return this value to 0 if set.
http://support.microsoft.com/kb/899000
*/
DECLARE @CoreCount int;
DECLARE @NumaNodes int;
SET @CoreCount = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (
SELECT MAX(c.memory_node_id) + 1
FROM sys.dm_os_memory_clerks c
WHERE memory_node_id < 64
);
IF @CoreCount > 4 /* If less than 5 cores, don't bother. */
BEGIN
DECLARE @MaxDOP int;
/* 3/4 of Total Cores in Machine */
SET @MaxDOP = @CoreCount * 0.75;
/* if @MaxDOP is greater than the per NUMA node
Core Count, set @MaxDOP = per NUMA node core count
*/
IF @MaxDOP > (@CoreCount / @NumaNodes)
SET @MaxDOP = (@CoreCount / @NumaNodes) * 0.75;
/*
Reduce @MaxDOP to an even number
*/
SET @MaxDOP = @MaxDOP - (@MaxDOP % 2);
/* Cap MAXDOP at 8, according to Microsoft */
IF @MaxDOP > 8 SET @MaxDOP = 8;
PRINT 'Suggested MAXDOP = ' + CAST(@MaxDOP as varchar(max));
END
ELSE
BEGIN
PRINT 'Suggested MAXDOP = 0 since you have less than 4 cores total.';
PRINT 'This is the default setting, you likely do not need to do';
PRINT 'anything.';
END
Saya menyadari ini sedikit subjektif, dan dapat bervariasi berdasarkan banyak hal; namun saya mencoba membuat kode yang ketat untuk digunakan sebagai titik awal untuk server baru.
Adakah yang punya input pada kode ini?
sql-server
configuration
maxdop
Max Vernon
sumber
sumber
Jawaban:
Cara terbaik untuk melakukannya adalah - gunakan coreinfo (utilitas oleh sysinternals) karena ini akan memberi Anda
Sekarang, berdasarkan info di atas, pengaturan Ideal MaxDop harus dihitung sebagai
Jadi jawabannya adalah - " itu tergantung " pada jejak prosesor Anda dan konfigurasi NUMA dan tabel di bawah ini akan merangkum apa yang saya jelaskan di atas:
Diedit: Di bawah ini adalah skrip TSQL cepat dan kotor untuk menghasilkan Rekomendasi untuk pengaturan MAXDOP
SUNTING: Untuk pengunjung masa depan, Anda dapat melihat fungsi tes-dbamaxdop powershell (bersama dengan fungsi DBA lainnya yang sangat membantu (SEMUA GRATIS !!).
sumber
test-dbamaxdop
seperti yang disebutkan dalam jawaban saya?Saat mengatur MAXDOP, Anda biasanya ingin membatasinya ke jumlah inti dalam simpul NUMA. Dengan cara itu jadwal tidak mencoba mengakses memori melintasi numa node.
sumber
Melihat pos dari tim MSDN , saya telah menemukan cara untuk mendapatkan jumlah inti fisik dari mesin dengan andal, dan menggunakannya untuk menentukan pengaturan MAXDOP yang baik.
Dengan "baik", maksud saya konservatif. Artinya, persyaratan saya adalah untuk menggunakan maksimum 75% dari core dalam NUMA node, atau maksimum keseluruhan 8 core.
SQL Server 2016 (13.x) SP2 dan di atasnya, dan semua versi SQL Server 2017 dan detail permukaan di atas tentang jumlah inti fisik per soket, jumlah soket, dan jumlah node NUMA, memungkinkan cara yang rapi untuk menentukan garis dasar Pengaturan MAXDOP untuk instalasi SQL Server baru.
Untuk versi yang disebutkan di atas, kode ini akan merekomendasikan pengaturan MAXDOP konservatif 75% dari jumlah inti fisik dalam simpul NUMA:
Untuk versi SQL Server sebelum SQL Server 2017 atau SQL Server 2016 SP2, Anda tidak bisa mendapatkan node-count-per-numa-node dari
sys.dm_os_sys_info
. Sebagai gantinya, kita dapat menggunakan PowerShell untuk menentukan jumlah inti fisik:Satu juga dapat menggunakan PowerShell untuk menentukan jumlah core logis, yang kemungkinan akan menjadi dua kali lipat jumlah core fisik jika HyperThreading dihidupkan:
T-SQL:
sumber
SELECT [@CoreCount] = @CoreCount , [@NumaNodes] = @NumaNodes , [@MaxDOP] = @MaxDOP
Sebagai aturan umum, gunakan DOP yang lebih tinggi untuk sistem OLAP, dan DOP yang lebih rendah (atau tidak ada) untuk sistem OLTP. Banyak sistem berada di antara keduanya, jadi temukan media bahagia yang memungkinkan beban kerja besar sesekali untuk mendapatkan CPU yang cukup untuk diselesaikan dengan cepat, tanpa mencekik beban kerja OLTP Anda.
Juga, berhati-hatilah dalam menggunakan
cpu_count
kolom untuk mendapatkan jumlah inti. Jika hyperthreading diaktifkan, kolom ini tampaknya mencerminkan jumlah prosesor logis yang terpapar. Secara umum, Anda tidak ingin DOP lebih tinggi dari jumlah inti fisik. Menyebarkan beban kerja paralel paralel di prosesor logis hanya akan meningkatkan overhead tanpa manfaat nyata.Ada juga
hyperthread_ratio
kolom, tapi saya tidak yakin apa yang diwakilinya. Dokumentasinya juga tidak terlalu jelas. Angka yang saya lihat pada sistem kami menunjukkan bahwa itu bisa berupa jumlah core fisik di seluruh sistem, atau jumlah prosesor logis per chip. Dokumentasi mengklaim saya harus melihat sosok yang berbeda sama sekali.sumber
hyperthread_ratio
jumlah inti logis per prosesor. Saya mengalami hal itu beberapa waktu lalu dan jika saya ingat dengan benar, itulah kesimpulan yang saya ambil. Mungkin @AaronBertrand memiliki info lebih lanjut tentang itu. Jangan menganggap itu sebagai fakta yang keras dan cepat sebelum verifikasi.Saya juga menemukan artikel http://support.microsoft.com/kb/2806535 dan tidak dapat menemukan korelasi dengan skrip di atas.
Saya juga ingin tahu, mengapa ada diferensiasi untuk "@logicalCPUs> = 8 dan @HTEnabled = 1 dan @NoofNUMA = 1" dan "@logicalCPUs> = 8 dan @HTEnabled = 1 dan @NoofNUMA> 1" sebagai hasilnya menjadi sama.
Setelah semua saya akhirnya menulis sepotong kode saya sendiri yang cocok dengan artikel dari atas, meskipun bahkan di sana saya akan menyukai definisi dan / atau diferensiasi yang lebih tepat tentang "prosesor" "CPU" dan "prosesor fisik".
Merasa bebas untuk berputar dengan itu.
sumber
hyperthread_ratio
kolomsys.dm_os_sys_info
ini menyesatkan ... di workstation saya, misalnya, saya memiliki CPU 4-core tunggal dengan diaktifkan HyperShreading - Task Manager melihat 8 CPU logis, dan kode Anda melaporkan rasio HyperShreading ke menjadi 1.Versi ini memberi Anda satu set hasil yang bagus dengan pengaturan MAXDOP yang ada dan harus tahan pada versi SQL 2008-2017 tanpa perlu menggunakan xp_cmdshell.
sumber
Skrip yang bagus, tetapi artikel kb: http://support.microsoft.com/kb/2806535 tidak sepenuhnya cocok dengan kode Anda. Apa yang saya lewatkan?
Server 1
HTEnabled: 1
hyperthreadingRatio: 12
cpus logis: 24
cpus fisik: 2
cpus logis per numa: 12
NoOfNuma: 2
Pengaturan MaxDop harus: 6
Server 2
HTEnabled: 2
hyperthreadingRatio: 16
cpus logis: 64 cpus logis: 64
cpus
logis per 64 numa: 16
NoOfNuma: 4
Pengaturan MaxDop harus: 4
Saya menyadari ini hanya saran; tetapi sesuatu tampaknya tidak benar bagi saya bahwa server (# 2) di atas dengan 4 prosesor, bukan 2, dan 8 core per CPU fisik, bukan 6; akan merekomendasikan MAXDOP pada 4, dibandingkan 6 untuk server yang kurang kuat.
Artikel kbb di atas menyarankan 8 skenario saya di atas. "Untuk server yang mengonfigurasi NUMA dan mengaktifkan HyperShreading, nilai MAXDOP tidak boleh melebihi jumlah prosesor fisik per node NUMA."
sumber
Selama instalasi SQL Server 2019 CTP 3.0 ada tab baru MaxDOP. Nilai aktual sudah ditentukan sebelumnya (dalam versi sebelumnya standarnya adalah 0).
Pengaturan MAXDOP Selama SQL Server 2019 Setup
Sumber gambar: https://www.brentozar.com/wp-content/uploads/2019/05/SQL_Server_2019_Setup.png
sumber