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 मिनट, जिस बिंदु पर यह या तो मेरे द्वारा मांगी गई विंडो प्रदर्शित करता है, या इस त्रुटि संदेश को प्रदर्शित करता है:
मैं SMO स्क्रिप्ट ऑब्जेक्ट का उपयोग करके इस उदाहरण के विरुद्ध कुछ PowerShell स्क्रिप्टिंग करने का प्रयास कर रहा हूं , और उसी तरह का व्यवहार देख सकता हूं। PS स्क्रिप्ट डेटाबेस में ऑब्जेक्ट्स के माध्यम से लूप करता है और उन्हें फाइल करने के लिए स्क्रिप्ट करता है, और जबकि यह वस्तुओं की सूची को अपेक्षाकृत जल्दी से इकट्ठा करने के लिए काम करता है, प्रत्येक व्यक्तिगत ऑब्जेक्ट स्क्रिप्ट में 5-10 मिनट लेता है - उपयोग करने योग्य होने के लिए बहुत धीमा।
मेरे पास एक कूबड़ है कि एकल उजागर बंदरगाह पर्याप्त नहीं है और एसएमओ और एसएसएमएस एक समान तरीके से जुड़ने की कोशिश कर रहे हैं जो उन्हें धीमा कर रहा है। क्या ऐसा भी हो सकता है कि लोकलहोस्ट से कनेक्ट करते समय, ये उपकरण वहां मौजूद अन्य संचार माध्यमों को मान लें जो आमतौर पर फ़ायरवॉल नहीं होंगे? क्या कोई अतिरिक्त कनेक्शन पैरामीटर है जिसका मैं उपयोग कर सकता हूं? क्या कोई मेरी धारणा को मान्य कर सकता है कि SSMS SQL सर्वर से बात करने के लिए SMO या कुछ और का उपयोग कर रहा है?
अद्यतन: मैं अभी भी जांच कर रहा हूं, लेकिन यह प्रशंसनीय है कि यह संसाधन बाधाओं के आसपास एक डॉकयर मुद्दा है। यह भ्रामक है क्योंकि अधिकांश दस्तावेज़ीकरण से यह प्रतीत होता है कि विंडोज कंटेनरों में कोई डिफ़ॉल्ट संसाधन की कमी नहीं है (और ये विंडोज जीयूआई के लिए डॉकर में सेट नहीं किए जा सकते हैं - केवल लिनक्स कंटेनरों के लिए ), लेकिन ऐसा लगता है कि वास्तव में, विंडोज विंडोज 10 पर चलने वाले कंटेनरों में 1GB का डिफॉल्ट रैम एलोकेशन मिलता है। मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि इसके रैम और सीपीयू आवंटन को देखने के लिए एक रनिंग कंटेनर का निरीक्षण कैसे किया जाए, लेकिन आगे मुझे बस उन डिफॉल्टों को बढ़ाने की कोशिश करनी है, जो docker run
मापदंडों का उपयोग कर रहे हैं ।
अन्य अद्यतन: मैं किसी भी प्रकार के विश्वसनीय मीट्रिक को पाने में विफल रहा हूँ जो मुझे बताता है कि कंटेनर के लिए सीपीयू और मेमोरी की सीमा क्या है। वैरिंग अनुसंधान इंगित करता है कि या तो डॉक कंटेनर में डिफ़ॉल्ट रूप से मेमोरी सीमा नहीं है, या वे करते हैं और यह 1GB है, लेकिन मैं इस समय यह सत्यापित कर सकता हूं कि docker stats
SQL कंटेनर केवल 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 होस्ट से अपनी पॉवरशेल स्क्रिप्ट चलाई, तो यह तेज़ भी था।
मैंने इस उत्तर के बजाय प्रश्न को इस अद्यतन में जोड़ा क्योंकि मैं अभी भी इस बात का स्पष्टीकरण खोज रहा हूं कि यह क्यों हो रहा है, और यदि उस नाम से "लोकलहोस्ट" के कनेक्शन के लिए इसे ठीक करने का कोई तरीका है।