SMO, SSMS लोकलहोस्ट से कनेक्ट होने पर डॉकर में SQL सर्वर के प्रबंधन के लिए धीमा है


9

TL; DR: IPv6 लूपबैक ( ::1) में हल करने वाले नाम के माध्यम से मेरे SQL सर्वर डॉकर कंटेनर से कनेक्ट करते समय , SMO कॉल वास्तव में धीमी होती हैं। उपयोग करते समय 127.0.0.1, वे तेज़ होते हैं।


मैं यह जानने की कोशिश कर रहा हूं कि डॉकर छवि microsoft / mssql-server-windows-developer का उपयोग कैसे करें । Microsoft के दस्तावेज़ों के अनुसार, यह कंटेनर केवल 1433 TCP पोर्ट को उजागर करता है।

docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer

मैं विंडोज 10 पर कंटेनर चला रहा हूं, और इसे शुरू करने में सफल रहा हूं, SQL सर्वर प्रमाणीकरण के साथ प्रमाणीकरण कर रहा हूं, और विंडोज़ होस्ट (लोकलहोस्ट या ""), और SQL पर SQLLcmd और SSMS 17.4 का उपयोग करके उदाहरण के खिलाफ क्वेरी चला रहा हूं। एक मैक पर स्टूडियो आईपी से कनेक्ट अगले दरवाजे। जब इस तरह से प्रश्न चल रहे हों तो मुझे कोई ध्यान देने योग्य प्रदर्शन समस्याएँ नहीं दिखतीं।

SSMS में, मैं ऑब्जेक्ट एक्सप्लोरर को भी ब्राउज़ कर सकता हूं, लेकिन अगर मैं ऑब्जेक्ट एक्सप्लोरर में ऑब्जेक्ट पर राइट क्लिक मेनू से कुछ करने की कोशिश करता हूं, जैसे इंस्टेंस पैरामीटर विंडो खोलें या डेटाबेस संलग्न करें, तो SSMS लगभग 5 के लिए प्रतिक्रिया नहीं दिखाता है। -10 मिनट, जिस बिंदु पर यह या तो मेरे द्वारा मांगी गई विंडो प्रदर्शित करता है, या इस त्रुटि संदेश को प्रदर्शित करता है:

SSMS त्रुटि संदेश

मैं SMO स्क्रिप्ट ऑब्जेक्ट का उपयोग करके इस उदाहरण के विरुद्ध कुछ PowerShell स्क्रिप्टिंग करने का प्रयास कर रहा हूं , और उसी तरह का व्यवहार देख सकता हूं। PS स्क्रिप्ट डेटाबेस में ऑब्जेक्ट्स के माध्यम से लूप करता है और उन्हें फाइल करने के लिए स्क्रिप्ट करता है, और जबकि यह वस्तुओं की सूची को अपेक्षाकृत जल्दी से इकट्ठा करने के लिए काम करता है, प्रत्येक व्यक्तिगत ऑब्जेक्ट स्क्रिप्ट में 5-10 मिनट लेता है - उपयोग करने योग्य होने के लिए बहुत धीमा।

मेरे पास एक कूबड़ है कि एकल उजागर बंदरगाह पर्याप्त नहीं है और एसएमओ और एसएसएमएस एक समान तरीके से जुड़ने की कोशिश कर रहे हैं जो उन्हें धीमा कर रहा है। क्या ऐसा भी हो सकता है कि लोकलहोस्ट से कनेक्ट करते समय, ये उपकरण वहां मौजूद अन्य संचार माध्यमों को मान लें जो आमतौर पर फ़ायरवॉल नहीं होंगे? क्या कोई अतिरिक्त कनेक्शन पैरामीटर है जिसका मैं उपयोग कर सकता हूं? क्या कोई मेरी धारणा को मान्य कर सकता है कि SSMS SQL सर्वर से बात करने के लिए SMO या कुछ और का उपयोग कर रहा है?


अद्यतन: मैं अभी भी जांच कर रहा हूं, लेकिन यह प्रशंसनीय है कि यह संसाधन बाधाओं के आसपास एक डॉकयर मुद्दा है। यह भ्रामक है क्योंकि अधिकांश दस्तावेज़ीकरण से यह प्रतीत होता है कि विंडोज कंटेनरों में कोई डिफ़ॉल्ट संसाधन की कमी नहीं है (और ये विंडोज जीयूआई के लिए डॉकर में सेट नहीं किए जा सकते हैं - केवल लिनक्स कंटेनरों के लिए ), लेकिन ऐसा लगता है कि वास्तव में, विंडोज विंडोज 10 पर चलने वाले कंटेनरों में 1GB का डिफॉल्ट रैम एलोकेशन मिलता है। मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि इसके रैम और सीपीयू आवंटन को देखने के लिए एक रनिंग कंटेनर का निरीक्षण कैसे किया जाए, लेकिन आगे मुझे बस उन डिफॉल्टों को बढ़ाने की कोशिश करनी है, जो docker runमापदंडों का उपयोग कर रहे हैं ।


अन्य अद्यतन: मैं किसी भी प्रकार के विश्वसनीय मीट्रिक को पाने में विफल रहा हूँ जो मुझे बताता है कि कंटेनर के लिए सीपीयू और मेमोरी की सीमा क्या है। वैरिंग अनुसंधान इंगित करता है कि या तो डॉक कंटेनर में डिफ़ॉल्ट रूप से मेमोरी सीमा नहीं है, या वे करते हैं और यह 1GB है, लेकिन मैं इस समय यह सत्यापित कर सकता हूं कि docker statsSQL कंटेनर केवल 750 और 850 मेग के बीच का उपयोग कर रहा है , और जब मैं उपलब्ध मेमोरी को 4 जीबी पर सेट करने के लिए एक रन पैरामीटर जोड़ने की कोशिश करता हूं, यह त्रुटियां हैं। इसलिए मैंने जांच के उस धागे का अनुसरण करना बंद कर दिया और एक अलग आंत जांच के लिए चला गया: चल रहे कंटेनर पर एक इंटरैक्टिव पॉवरशेल सत्र में प्रवेश करना और फिर कंटेनर के अंदर से ऊपर से जुड़ी मेरी पॉवरशेल लिपि को लागू करना ।

कंटेनर के अंदर भागना कोई समस्या नहीं थी। यह सिर्फ एक-दो मिनट में 2780 वस्तुओं के माध्यम से प्रस्फुटित हुआ। मुझे लगता है कि यह पुष्टि करता है कि समस्या कंटेनर / होस्ट सीमा के साथ है, इसलिए मैं यह देखने जा रहा हूं कि क्या मैं उस यूडीपी पोर्ट को खोल सकता हूं। अद्यतन: 1434 UDP पोर्ट खोलने में मदद नहीं की।


अधिक अद्यतन- वर्कअवेर्ड अचीव्ड, न कि संसाधन की कमी का मुद्दा: विंडोज़ कंटेनरों के लिए बड़ी मेमोरी एलोकेशन सेट करने से संबंधित समस्याएँ दिखाई देती हैं - मुझे 3 जी और 2 जी के लिए समान त्रुटियां प्राप्त हो रही थीं, लेकिन अंततः 1.5 जी के साथ कंटेनर को शुरू करने में सक्षम था, और I DID docker statsको कंटेनर के लिए एक अंतर दिखाई देता है जो (मुझे लगता है) पुष्टि करता है कि यह 1GB के डिफ़ॉल्ट आवंटन के साथ चल रहा था। डिफ़ॉल्ट सेटिंग्स पर, PRIV WORKING SET स्टेटमेंट (जिसके लिए मुझे कोई दस्तावेज नहीं मिल सकता है, लेकिन मेरा सबसे अच्छा अनुमान है कि यह RAM है) 700MiB और 850MiB के बीच है। साथ मेंdocker run —memory="1.5g"सेट, यह लगभग 1.0GiB है। इसलिए इसने विस्तार किया, लेकिन यह पहले की तुलना में अधिक आवंटन मुक्त छोड़ता प्रतीत होता है। मैं इसका अर्थ (शायद गलत तरीके से) लगाता हूं कि यह सर्वर (जो पूरी तरह से लोड नहीं चल रहा है और कोई उपयोगकर्ता डेटाबेस नहीं है) स्मृति दबाव में नहीं है। मैंने पुष्टि करने के लिए अधिकतम सर्वर मेमोरी सेटिंग की जांच की कि यह डिफ़ॉल्ट अधिकतम 2PiB पर सेट है।

तब चीजें अजीब हो गईं। मैं अभी भी विभिन्न स्थानों से अपनी शक्तियाँ लिपि चलाकर चीजों का परीक्षण कर रहा हूँ। कंटेनर के अंदर उपवास, मेजबान पर धीमा। तब मैं नेटवर्क पर एक और विंडोज़ मशीन के लिए RDP'd, और THAT मशीन से स्क्रिप्ट को चलाया, आईपी द्वारा मेरे विंडोज 10 होस्ट से कनेक्ट। और यह तेज़ था! यह इस सिद्धांत का समर्थन करता है कि स्थानीयहोस्ट करने वाली किसी चीज़ से कनेक्ट होने पर, SMO SQL सर्वर से कनेक्ट करने की कोशिश कर रहा है जो पोर्ट 1433 टीसीपी के अलावा किसी और चीज़ का उपयोग कर रहा है, जो टीसीपी कनेक्शन पर वापस आने से पहले बहुत लंबे समय तक प्रतीक्षा करता है।

मैंने स्थानीय होस्ट के अलावा किसी अन्य नाम से लोकलहोस्ट को संदर्भित करने के लिए एक होस्ट फ़ाइल प्रविष्टि दर्ज करके इस सिद्धांत को मान्य करने का प्रयास करने का निर्णय लिया:

        127.0.0.1       dockersucks

मैं SSMS से लोकलहोस्ट या "।" के बजाय डॉकर्सकुक्स से जुड़ा, और तुरंत चीजें तेज हो गईं। ऑब्जेक्ट एक्सप्लोरर को नेविगेट करना हमेशा की तरह था, और संलग्न डेटाबेस या सर्वर गुण जैसे पैनल खोलने से सामान्य रूप से जल्दी हुआ। और, जब मैंने सर्वर 10 नाम के रूप में इस उपनाम का उपयोग करके विंडोज़ 10 होस्ट से अपनी पॉवरशेल स्क्रिप्ट चलाई, तो यह तेज़ भी था।

मैंने इस उत्तर के बजाय प्रश्न को इस अद्यतन में जोड़ा क्योंकि मैं अभी भी इस बात का स्पष्टीकरण खोज रहा हूं कि यह क्यों हो रहा है, और यदि उस नाम से "लोकलहोस्ट" के कनेक्शन के लिए इसे ठीक करने का कोई तरीका है।


हो सकता है कि आपका डॉकटर उदाहरण सिर्फ संचालित हो? यदि यह एक बंदरगाह मुद्दा था, तो मुझे संदेह है कि आप इसे काम करते हुए देख रहे हैं, इसलिए मैं उस सड़क पर ज्यादा समय नहीं बिताऊंगा।
लोवलीडा

हाँ, मैं उस बारे में सोच रहा था, लेकिन क्वेरी का प्रदर्शन ठीक है, इसलिए यह केवल कुछ प्रकार के कार्यों तक सीमित लगता है। मुझे इनसाइड कंटेनर से एसएमओ सामान चलाने का परीक्षण करने और यह सत्यापित करने की भी आवश्यकता है कि समस्या वहां मौजूद नहीं है।
NReilingh

1
मुझे वह हिस्सा याद नहीं था। SQL सर्वर कनेक्शन पूलिंग का उपयोग करता है। मुझे लगता है कि यह निराशाजनक है, लेकिन मैं आपको यह सुनिश्चित करने के लिए प्रभावित करना चाहता हूं कि कंटेनर (या "अजीब हाइपर-वी लाइट वीएम" इस मामले में) पर्याप्त रैम है। आपकी PS स्क्रिप्ट "जल्दी से" चली गई, लेकिन ~ 3000 ऑब्जेक्ट्स के माध्यम से चलने के लिए मिनट एक मशीन में पर्याप्त रैम (यानी 2 जीबी से अधिक) के साथ धीमी है।
Randolph West

1
पूरी तरह से ईमानदार होने के लिए, आप शायद अपनी मशीन पर एक उबंटू हाइपर-वी वीएम को स्पिन करना और लिनक्स के लिए SQL सर्वर स्थापित करना बेहतर है।
रैंडोल्फ वेस्ट

1
@bazzilic मैं समझाता हूं कि मेरे जवाब में क्यों। यदि आपको स्पष्टीकरण की आवश्यकता है तो कृपया वहाँ टिप्पणी करें।
NReilingh

जवाबों:


3

यह सबसे अधिक संभावना है कि राम भुखमरी का मुद्दा है।

जाँच करने के लिए चीजें:

  • क्या कंटेनर में 4 जीबी रैम है? इस उत्तर की जाँच करें
  • क्या आपने कंटेनर के अंदर SQL सर्वर के लिए मैक्स सर्वर मेमोरी सेटिंग कॉन्फ़िगर किया है? कंटेनर में कितना रैम SQL सर्वर देख सकता है, इसके आधार पर, यह 1 जीबी से 3.25 जीबी तक कुछ भी सेट किया जा सकता है।
  • क्या आपके मेजबान की रैम का उपयोग किया गया है, और क्या यह संभव है कि डॉकर डिस्क में पेजिंग कर रहा है? किसी भी बाहरी एप्लिकेशन को बंद करें (वेब ​​ब्राउज़र रैम के बड़े उपभोक्ता हैं)। SSMS को उपयोगी होने के लिए लगभग 1 GB कार्यशील RAM की आवश्यकता है।
  • क्या यह रिबूट के बाद तेज है?

यदि मैं स्वयं ऐसा कर रहा था, तो मैं डॉकर स्टोर से विंडोज के लिए डॉकर कम्युनिटी एडिशन को स्थापित करूंगा, और फिर उस तरह से SQL सर्वर डोकर इमेज को स्थापित करूंगा ।

यदि आपका इंटरनेट कनेक्शन पर्याप्त तेज़ है, तो आप 5 मिनट से कम समय में उठ सकते हैं, और बहुत आसान तरीके से संसाधनों को आवंटित करने में सक्षम हो सकते हैं।

संपादित करें: आह, नेटवर्किंग।


यकीन नहीं होता कि आप इसे गलत समझ रहे हैं, लेकिन मैं कंटेनर के अंदर एसएसएमएस नहीं चला रहा हूं । यह संभव नहीं है, क्योंकि विंडोज कंटेनर वर्तमान में आरडीपी कनेक्शन या जीयूआई का समर्थन नहीं करते हैं। मैं पहले से ही जानता हूं कि SQL सर्वर धीमा नहीं है - लेकिन मुझे यह पता लगाने की आवश्यकता है कि क्या मैं संसाधनों के लिए इस डॉकटर कंटेनर को भूखा हूं। कंटेनर और SSMS को चलाने वाले Windows 10 होस्ट में 10GB RAM और 2 कोर हैं, लेकिन मुझे यकीन नहीं है कि कंटेनर को कितना आवंटित किया जा रहा है।
NReilingh

मेरा जवाब फिर से लिखा गया है
Randolph West

अतिरिक्त जानकारी के लिए क्यू अपडेट देखें। ध्यान दें कि यह microsoft की अपनी कंटेनर इमेज बिल्ड है, इसलिए मुझे लगता है कि हम यह मानते हुए बहुत सुरक्षित हैं कि कंटेनर के भीतर सेटिंग कोई समस्या नहीं है।
NReilingh

2
कृपया वह धारणा न बनाएं!
Randolph West

@NReilingh मैंने -mविकल्प की जांच के लिए आपके उत्तर के लिए एक URL जोड़ा है ।
Randolph West

3

यहाँ मुख्य अंतर यह है कि SSMS / SMO IPv4 या IPv6 से जुड़ने का प्रयास कर रहा है या नहीं। यदि आप ping localhostकमांड प्रॉम्प्ट में ए करते हैं , तो आपको इसका समाधान देखना चाहिए ::1, जो कि IPv6 के बराबर है 127.0.0.1.एक ही काम से जुड़ना ।

आपका docker runआदेश केवल पोर्ट 1433 को उजागर करता है 127.0.0.1। आप यह netstat -aदेखने के लिए चल सकते हैं कि कौन से पोर्ट उपलब्ध हैं।

आपके द्वारा बनाया गया होस्ट फ़ाइल उर्फ ​​सीधे हल करता है 127.0.0.1, लेकिन आपको इसकी आवश्यकता नहीं है, क्योंकि आप 127.0.0.1सीधे एसएसएमएस से जुड़ सकते हैं और अपनी समस्या को इस तरह से हल कर सकते हैं । आपके होस्ट सिस्टम पर पूरी तरह से IPv6 को बंद करने से भी काम चल जाएगा, लेकिन मुझे यकीन नहीं है कि यह विंडोज 10 पर कितना उचित है।

मैं स्वीकार करने के लिए एक वैकल्पिक उत्तर पर विचार करूंगा कि अगर कोई मुझे बता सके कि IPv6 इसे क्यों तोड़ रहा है।


क्या आपने tcp से कनेक्ट करने का प्रयास किया है: लोकलहोस्ट? ऐसा हो सकता है कि SSMS / SMO एक साझा मेमोरी या नामित पाइप कनेक्शन का प्रयास कर रहे हैं जब नाम लोकलहोस्ट या (स्थानीय) या "" है। और 1। मुझे नहीं पता कि SSMS 17.4 निश्चित रूप से ऑब्जेक्ट एक्सप्लोरर में एसएमओ का उपयोग करता है, लेकिन मुझे लगता है कि यह संभव है।
मिस्टर मागू

@MisterMagoo tcp:localhostसर्वर नाम क्षेत्र में प्रवेश करना बिल्कुल भी काम नहीं करता है, लेकिन मैंने सुधार के बिना कनेक्शन संपत्तियों में टीसीपी / आईपी को स्पष्ट रूप से निर्दिष्ट करने की कोशिश की थी। मुझे अभी भी लगता है कि फेल 127.0.0.1होने पर समस्या लोकलहोस्ट के लिए धीमी गिरावट है ::1। मुझे लगता है कि मेरी क्वेरी विंडो काम कर रही थी क्योंकि वे एक कनेक्शन बनाए हुए थे, जबकि एसएमओ का उपयोग करने वाली मेरी स्क्रिप्ट (शायद) बार-बार नए कनेक्शन बना रही थी।
NReilingh

1
@NReilingh मैं इसी मुद्दे को देख रहा हूं - आपकी समस्या निवारण और स्पष्टीकरण वास्तव में सहायक थे। मेरे होस्ट परिवेश से मेरे एसक्यूएल सर्वर कंटेनर को 127.0.0.1 ( लोकलहोस्ट नहीं ) के रूप में संबोधित करना एकमात्र तरीका था जिससे मैं सामान्य रूप से काम कर रहे कंटेनर कनेक्शन को होस्ट कर सकता था ।
रोजर्सिलिटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.