ไม่กี่เดือนที่ผ่านมาฉันประสบกับสถานการณ์ที่คล้ายกันซึ่งการตั้งค่า MAXDOP เป็นค่าเริ่มต้นและแบบสอบถามที่เรียกใช้หมดลงทำให้เธรดผู้ทำงานทั้งหมด
ในฐานะที่เป็นรีมัสชี้ให้เห็นนี้เรียกว่าคนงานอดอยากด้าย
จะมีการถ่ายโอนข้อมูลหน่วยความจำที่สร้างขึ้นบนเซิร์ฟเวอร์ของคุณเมื่อเงื่อนไขนี้เกิดขึ้น
หากคุณอยู่ที่ 2008R2 + SP1 ขึ้นไปsys.dm_server_memory_dumps
จะให้ตำแหน่งของไฟล์ดัมพ์เช่นกัน
กลับไปที่ปัญหา:
มีเธรดการตรวจสอบกำหนดการ 1 รายการต่อ NUMA โหนดและเนื่องจากคุณมี 2 NUMA โหนดจะมี 2 เธรดการตรวจสอบกำหนดการซึ่งรับผิดชอบการตรวจสอบสุขภาพของตัวจัดตารางเวลาทุก ๆ 60 วินาทีสำหรับโหนด NUMA นั้นโดยเฉพาะในขณะที่ตรวจสอบให้แน่ใจว่า ไม่.
ทุกครั้งที่มีการดึงคำของานใหม่จากคิวของตัวกำหนดตารางเวลาตัวนับกระบวนการทำงานจะเพิ่มขึ้น ดังนั้นหากตัวกำหนดตารางเวลามีคำของานอยู่ในคิวและไม่ได้ประมวลผลคำของานใด ๆ ใน 60 วินาทีตัวจัดกำหนดการจะถูกพิจารณาว่าค้างอยู่
เนื่องจากการสอบถามที่เรียกใช้ออกไปหรือการขนานอย่างกว้างขวางมีเงื่อนไขของเธรดของผู้ปฏิบัติงานเริ่มหมดเนื่องจากเธรดทั้งหมดถูกครอบครองโดยแบบสอบถามที่เรียกใช้ครั้งเดียวนั้นหรือการบล็อกเป็นเวลานานเกินไปและไม่สามารถดำเนินการใด ๆ ได้
ทางออกที่ดีที่สุดของคุณคือการปรับการตั้งค่าMax Parallelism ของคุณก่อน ค่าเริ่มต้น0
หมายถึง SQL Server สามารถใช้ CPU ที่มีอยู่ทั้งหมดสำหรับการประมวลผลแบบขนานและที่นั่นโดยการหมดเธรดผู้ปฏิบัติงานทั้งหมด
มีสาเหตุหลายประการที่อาจนำไปสู่การหมดหัวข้องาน:
- กลุ่มการบล็อกที่มีความยาวจำนวนมากทำให้ SQL Server หมดจำนวนเธรด
- การขนานอย่างกว้างขวางยังนำไปสู่ความอ่อนล้าของหัวข้อคนงาน
- การรออย่างกว้างขวางสำหรับ "ล็อค" ประเภทใด ๆ - spinlocks, สลัก spinlock ที่กำพร้าเป็นตัวอย่าง
อ้างถึงคำตอบของฉันที่นี่ที่จะแสดงวิธีการคำนวณค่า MAXDOP สำหรับอินสแตนซ์เซิร์ฟเวอร์ของคุณ
นอกจากนี้ขอแนะนำให้คุณเริ่มเก็บรวบรวมข้อมูลสถิติเกี่ยวกับอินสแตนซ์เซิร์ฟเวอร์ฐานข้อมูลของคุณ
max degree of parallelism
การกำหนดค่าคืออะไรและมีตัวประมวลผลกี่ตัวที่คุณมีบนเซิร์ฟเวอร์พร้อมกับการกำหนดค่า NUMA ในปัจจุบัน คุณสามารถใช้coreinfo.exe
จากsysinternalsเพื่อค้นหาจำนวนโปรเซสเซอร์และการกำหนดค่า NUMA