उपयोगकर्ता कनेक्शन की अधिकतम संख्या


24

SQL सर्वर 2012 मानक संस्करण में, मुझे पता है कि उपयोगकर्ता कनेक्शन की अधिकतम संख्या 32,767 है। यदि मैं इस संख्या की ओर जा रहा हूं तो मुझे डीबीए के रूप में क्या करना चाहिए?

वर्तमान में 30,000 उपयोगकर्ता कनेक्शन हैं, और यह संख्या बढ़ने की उम्मीद है।

यहाँ छवि विवरण दर्ज करें


5
अगर ये किसी ऐप से हैं, तो एक बार इसके खत्म होने के बाद ऐप को अपना कनेक्शन बंद कर देना चाहिए। एक कनेक्शन को खुला छोड़ना इस सीमा को मारने का एक संभावित कारण है
मार्क सिनकिन्सन

जवाबों:


31

कनेक्शन की अधिकतम संख्याSQL सर्वर संस्करण और संस्करणों 32,767 है।

आप यह निर्धारित कर सकते हैं कि SQL सर्वर वर्तमान में कितने कनेक्शन देख रहा है:

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;

कई SQL सर्वर नोड्स में डेटा को तेज करके 32,767 से परे कनेक्शन की संख्या को रैखिक रूप से स्केल करना संभव है। हालांकि, मेरी राय में, कनेक्शन की संख्या पर सीमा के चारों ओर जाने के तरीके के रूप में शार्किंग का उपयोग करना मकड़ी को मारने के लिए परमाणु बम का उपयोग करने के समान है। यह मकड़ी को मार देगा , लेकिन आपको दिन के अंत में बड़ी समस्याएं हो सकती हैं। यह उल्लेख करने के लिए नहीं है कि यह परमाणु बम बनाने के लिए बहुत कठिन है, ठीक से लागू करने का उल्लेख नहीं है।


1
कारण है कि हम "killable" की पहचान करनी चाहिए आप व्याख्या कर सकते हैं सत्र sys.dm_exec_ में most_recent_sql_handle का उपयोग करके कनेक्शन के बजाय का उपयोग कर, कहते हैं, sys.dm_exec_ में स्थिति और last_request_start_time और is_user_process द्वारा सत्र ? यह एक अजीब विकल्प लगता है।
माइक शेरिल 'कैट रिकॉल'

यह एक अच्छा बिंदु है, @ माइक - उस समय मैं विशुद्ध रूप से उन कनेक्शनों के बारे में सोच रहा था जो कनेक्शन पूलिंग द्वारा खोले गए हैं और जिनका कभी उपयोग नहीं किया गया है। is_user_processक्वालीफायर में जोड़ना एक अच्छा विचार होगा, और निश्चित रूप से उन सत्रों को बाहर करने के लिए चोट नहीं पहुंचेगी last_request_start_timeजो हाल ही में हुए हैं। कैसे हाल? एक और अच्छा सवाल।
मैक्स वर्नोन

Last_request_start_time शायद नए के बजाय पुराना होना चाहिए। मुझे लगता है कि एक सुरक्षित "जानलेवा" उपयोगकर्ता सत्र एक होगा जो सो रहा है और कुछ दिनों के लिए अनुरोध नहीं किया है। मुझे लगता है कि कटऑफ का समय इस बात पर निर्भर करता है कि हमारे एप्लिकेशन प्रोग्रामर स्वयं के बाद सफाई में कितने अच्छे हैं।
माइक शेरिल 'कैट रिकॉल'

12

मैंने अतीत में कनेक्शन पूलिंग के साथ अजीब व्यवहार में भाग लिया है, और आपका परिदृश्य उन स्थितियों में से एक के साथ अच्छी तरह से संरेखित करता है। यदि आपका आवेदन कनेक्शन पूलिंग का उपयोग कर रहा है (और यह अभी भी अटकलें हैं, इस बिंदु पर, जब तक आप इसकी पुष्टि या इनकार नहीं करते हैं) तब आपके पास कई कनेक्शन होने वाले हैं जो खुले रहते हैं। यह डिजाइन द्वारा है।

कनेक्शन पूलिंग का उद्देश्य डेटाबेस कनेक्शन बनाने के ओवरहेड को कम करना है। उदाहरण के लिए, आइए 3. का एक कनेक्शन पूल। जहाँ तक मैं बता सकता हूँ कि जीवनचक्र कुछ इस तरह से चलता है (कोल्ड कनेक्शन पूल कैश से शुरू):

  1. अनुप्रयोग उपयोगकर्ता A डेटाबेस से कनेक्शन के लिए पूछता है
  2. कनेक्शन पूल डेटाबेस से कनेक्शन थ्रेड 1 शुरू करता है
  3. अनुप्रयोग उपयोगकर्ता B डेटाबेस से कनेक्शन के लिए पूछता है
  4. कनेक्शन पूल डेटाबेस से कनेक्शन थ्रेड 2 शुरू करता है
  5. एप्लिकेशन उपयोगकर्ता A कनेक्शन पूल में अपना कनेक्शन ... बंद कर देता है
  6. अनुप्रयोग उपयोगकर्ता C डेटाबेस से कनेक्शन के लिए पूछता है
  7. sp_reset_connectionथ्रेड 1 पर कनेक्शन पूल समस्याएँ
  8. कनेक्शन पूल अनुप्रयोग उपयोगकर्ता C को थ्रेड 1 असाइन करता है

यह एक निरीक्षण है, लेकिन मुख्य बिंदुओं में शामिल हैं:

  • कनेक्शन तब तक कनेक्शन पूल थ्रेड पूल और डेटाबेस के बीच खुला रहेगा जब तक डेटाबेस या कनेक्शन पूल जबरन कनेक्शन बंद नहीं कर देता
  • कनेक्शन पिछले सत्र निष्पादन संदर्भ के साथ खुला रहता है जब तक कि उस धागे का उपयोग किसी अन्य उपयोगकर्ता द्वारा फिर से नहीं किया जाता है, जिस समय बिंदु sp_reset_connectionकहा जाता है।

यहाँ संदर्भ सामग्री है जो मैं इन निष्कर्षों पर आया करता था।

SQL सर्वर DBA के लिए कनेक्शन पूलिंग

अनाथ लेनदेन का मामला

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.