ในรุ่นมาตรฐาน SQL Server 2012 ฉันรู้ว่าจำนวนการเชื่อมต่อผู้ใช้สูงสุดคือ 32,767 ฉันควรทำอย่างไรในฐานะ DBA ถ้าฉันมุ่งหน้าไปยังหมายเลขนี้
ขณะนี้มีการเชื่อมต่อกับผู้ใช้ 30,000 รายและคาดว่าจำนวนนี้จะเพิ่มขึ้น
ในรุ่นมาตรฐาน SQL Server 2012 ฉันรู้ว่าจำนวนการเชื่อมต่อผู้ใช้สูงสุดคือ 32,767 ฉันควรทำอย่างไรในฐานะ DBA ถ้าฉันมุ่งหน้าไปยังหมายเลขนี้
ขณะนี้มีการเชื่อมต่อกับผู้ใช้ 30,000 รายและคาดว่าจำนวนนี้จะเพิ่มขึ้น
คำตอบ:
จำนวนสูงสุดของการเชื่อมต่อทั่ว SQL Server และรุ่นรุ่นคือ 32,767
คุณสามารถกำหนดจำนวนการเชื่อมต่อของ SQL Server ในปัจจุบันได้โดยดูที่:
SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END
, CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END;
หากอัตราส่วนระหว่างการเชื่อมต่อที่ใช้งานและการเชื่อมต่อที่ไม่ได้ใช้จากแบบสอบถามด้านบนเป็นไปได้ว่าการรวมการเชื่อมต่อนั้นเปิดใช้งานโดยแอปพลิเคชันไคลเอนต์ที่เชื่อมต่อกับเซิร์ฟเวอร์และการเชื่อมต่อเหล่านั้น คุณอาจต้องการให้นักพัฒนาปรับเปลี่ยนสตริงการเชื่อมต่อสำหรับแอปพลิเคชันเหล่านี้เพื่อ จำกัด ขนาดของพูลการเชื่อมต่อและตรวจสอบให้แน่ใจว่าพวกเขากำลังกำจัดการเชื่อมต่ออย่างถูกต้อง หากการเชื่อมต่อไม่ได้ถูกกำจัดอย่างถูกต้องการเชื่อมต่อเหล่านั้นจะยังคงเปิดอยู่ตราบเท่าที่แอปพลิเคชันไคลเอนต์ทำงานอยู่
หากคุณมีความรู้สึกโดยเฉพาะอย่างยิ่งบ้าและจำเป็นที่จะต้องได้รับการกำจัดของการเชื่อมต่อทั้งหมดที่ยังไม่ได้ดำเนินการอะไรเมื่อเร็ว ๆ นี้ (โดยไม่คำนึงถึงว่าพวกเขาเป็นจริงในขณะนี้การปฏิบัติงาน) คุณสามารถเรียกใช้รหัสต่อไปนี้ซึ่งจะสร้างรายชื่อของการประชุมที่ สามารถฆ่าได้ คุณต้องคัดลอกและวางคำสั่งที่สร้างขึ้นในหน้าต่าง SSMS ใหม่เพื่อเรียกใช้คำสั่งจริง ฉันยังแนะนำให้มีการเขียนประวัติส่วนตัวของคุณขึ้นไปวันเพียงในกรณีที่
DECLARE @cmd NVARCHAR(MAX); SET @cmd = ''; SELECT @cmd = @cmd + CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';' FROM sys.dm_exec_connections dec WHERE dec.most_recent_sql_handle = 0x0;
PRINT @cmd;
มีความเป็นไปได้ที่จะขยายจำนวนการเชื่อมต่อเป็นเส้นตรงเกิน 32,767 เส้นโดยการแบ่งข้อมูลข้ามโหนด SQL Server หลายโหนด อย่างไรก็ตามในความคิดของฉันการใช้การเรียงตัวเพื่อหลีกเลี่ยงข้อ จำกัด เกี่ยวกับจำนวนการเชื่อมต่อนั้นคล้ายกับการใช้อะตอมระเบิดเพื่อฆ่าแมงมุม มันจะฆ่าแมงมุม แต่คุณอาจมีปัญหาใหญ่กว่าในตอนท้ายของวัน ไม่พูดถึงมันค่อนข้างยากที่จะสร้างระเบิดปรมาณู
is_user_process
รอบคัดเลือกและแน่นอนจะไม่เจ็บที่จะยกเว้นการประชุมที่มีlast_request_start_time
ที่ค่อนข้างล่าสุด ล่าสุดได้อย่างไร อีกคำถามที่ดี
ฉันเคยพบพฤติกรรมแปลก ๆ ด้วยการรวมการเชื่อมต่อในอดีตและสถานการณ์ของคุณสอดคล้องกับสถานการณ์เหล่านั้นอย่างใดอย่างหนึ่ง หากแอปพลิเคชันของคุณใช้การรวมการเชื่อมต่อ (และยังคงเป็นการเก็งกำไร ณ จุดนี้จนกว่าคุณจะยืนยันหรือปฏิเสธ) คุณจะต้องมีการเชื่อมต่อมากมายที่ยังคงเปิดอยู่ นี่คือโดยการออกแบบ
การรวมการเชื่อมต่อมีจุดมุ่งหมายเพื่อลดค่าใช้จ่ายในการสร้างการเชื่อมต่อฐานข้อมูล ตัวอย่างเช่นเอาพูลการเชื่อมต่อเป็น 3 เท่าที่ฉันสามารถบอกได้ว่าวงจรชีวิตจะเป็นแบบนี้ (เริ่มจากแคชพูลการเชื่อมต่อแบบ cold):
sp_reset_connection
ต่อในเธรด 1นี่คือการทำให้ใหญ่เกินไป แต่คะแนนเด่นรวมถึง:
sp_reset_connection
จะเรียกว่าณ เวลาใดเวลาหนึ่งนี่คือข้อมูลอ้างอิงที่ฉันเคยได้ข้อสรุปเหล่านี้