จำนวนการเชื่อมต่อผู้ใช้สูงสุด


24

ในรุ่นมาตรฐาน SQL Server 2012 ฉันรู้ว่าจำนวนการเชื่อมต่อผู้ใช้สูงสุดคือ 32,767 ฉันควรทำอย่างไรในฐานะ DBA ถ้าฉันมุ่งหน้าไปยังหมายเลขนี้

ขณะนี้มีการเชื่อมต่อกับผู้ใช้ 30,000 รายและคาดว่าจำนวนนี้จะเพิ่มขึ้น

ป้อนคำอธิบายรูปภาพที่นี่


5
หากสิ่งเหล่านี้มาจากแอปแอปควรปิดการเชื่อมต่อเมื่อแอปเสร็จสิ้น ออกจากการเชื่อมต่อเปิดเป็นเหตุผลที่เป็นไปได้สำหรับการกดขีด จำกัด นี้
Mark Sinkinson

คำตอบ:


31

จำนวนสูงสุดของการเชื่อมต่อทั่ว 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 หลายโหนด อย่างไรก็ตามในความคิดของฉันการใช้การเรียงตัวเพื่อหลีกเลี่ยงข้อ จำกัด เกี่ยวกับจำนวนการเชื่อมต่อนั้นคล้ายกับการใช้อะตอมระเบิดเพื่อฆ่าแมงมุม มันจะฆ่าแมงมุม แต่คุณอาจมีปัญหาใหญ่กว่าในตอนท้ายของวัน ไม่พูดถึงมันค่อนข้างยากที่จะสร้างระเบิดปรมาณู


1
คุณสามารถอธิบายเหตุผลที่เราควรระบุ "killable" การประชุมโดยใช้ most_recent_sql_handle ใน sys.dm_exec_ การเชื่อมต่อมากกว่าโดยใช้การพูด, สถานะและ last_request_start_time และ is_user_process ใน sys.dm_exec_ ประชุม ? ดูเหมือนจะเป็นทางเลือกที่แปลก
Mike Sherrill 'Cat Recall'

เป็นจุดที่ดี @ ไมค์ - ในขณะที่ฉันกำลังคิดถึงการเชื่อมต่อที่เปิดโดยการรวมการเชื่อมต่อและไม่เคยใช้ มันเป็นความคิดที่ดีที่จะเพิ่มในis_user_processรอบคัดเลือกและแน่นอนจะไม่เจ็บที่จะยกเว้นการประชุมที่มีlast_request_start_timeที่ค่อนข้างล่าสุด ล่าสุดได้อย่างไร อีกคำถามที่ดี
Max Vernon

last_request_start_time น่าจะเก่ากว่าใหม่กว่า ฉันคิดว่าเซสชั่นผู้ใช้ที่ "ฆ่าได้" อย่างปลอดภัยน่าจะเป็นเซสชั่นที่กำลังนอนหลับและไม่ได้ขอเวลาสองสามวัน ฉันเดาว่าเวลาตัดยอดขึ้นอยู่กับความดีของโปรแกรมเมอร์แอปพลิเคชันของเรา
Mike Catrill 'Cat Recall'

12

ฉันเคยพบพฤติกรรมแปลก ๆ ด้วยการรวมการเชื่อมต่อในอดีตและสถานการณ์ของคุณสอดคล้องกับสถานการณ์เหล่านั้นอย่างใดอย่างหนึ่ง หากแอปพลิเคชันของคุณใช้การรวมการเชื่อมต่อ (และยังคงเป็นการเก็งกำไร ณ จุดนี้จนกว่าคุณจะยืนยันหรือปฏิเสธ) คุณจะต้องมีการเชื่อมต่อมากมายที่ยังคงเปิดอยู่ นี่คือโดยการออกแบบ

การรวมการเชื่อมต่อมีจุดมุ่งหมายเพื่อลดค่าใช้จ่ายในการสร้างการเชื่อมต่อฐานข้อมูล ตัวอย่างเช่นเอาพูลการเชื่อมต่อเป็น 3 เท่าที่ฉันสามารถบอกได้ว่าวงจรชีวิตจะเป็นแบบนี้ (เริ่มจากแคชพูลการเชื่อมต่อแบบ cold):

  1. ผู้ใช้แอปพลิเคชัน A ขอการเชื่อมต่อกับฐานข้อมูล
  2. พูลการเชื่อมต่อเริ่มเธรดการเชื่อมต่อ 1 ไปยังฐานข้อมูล
  3. ผู้ใช้แอปพลิเคชัน B ขอการเชื่อมต่อกับฐานข้อมูล
  4. พูลการเชื่อมต่อเริ่มเธรดการเชื่อมต่อ 2 ไปยังฐานข้อมูล
  5. ผู้ใช้แอปพลิเคชัน A ปิดการเชื่อมต่อ ... กับกลุ่มการเชื่อมต่อ
  6. ผู้ใช้แอปพลิเคชัน C ถามการเชื่อมต่อกับฐานข้อมูล
  7. ปัญหาพูลการเชื่อมsp_reset_connectionต่อในเธรด 1
  8. พูลการเชื่อมต่อกำหนดเธรด 1 ให้แก่ผู้ใช้ Application C

นี่คือการทำให้ใหญ่เกินไป แต่คะแนนเด่นรวมถึง:

  • การเชื่อมต่อจะยังคงเปิดอยู่ระหว่างพูลเธรดพูลการเชื่อมต่อและฐานข้อมูลจนกว่าฐานข้อมูลหรือพูลการเชื่อมต่อจะบังคับปิดการเชื่อมต่อ
  • การเชื่อมต่อยังคงเปิดอยู่พร้อมกับบริบทการดำเนินการเซสชันล่าสุดจนกว่าเธรดนั้นจะถูกใช้ซ้ำโดยผู้ใช้รายอื่นซึ่งsp_reset_connectionจะเรียกว่าณ เวลาใดเวลาหนึ่ง

นี่คือข้อมูลอ้างอิงที่ฉันเคยได้ข้อสรุปเหล่านี้

การรวมการเชื่อมต่อสำหรับ SQL Server DBA

กรณีของการทำธุรกรรมกำพร้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.