TL; DR:เมื่อเชื่อมต่อคอนเทนเนอร์ SQL Server Docker ของฉันผ่านชื่อที่แปลงเป็นลูปแบ็ค IPv6 ( ::1
) การโทร SMO ช้ามาก เมื่อใช้127.0.0.1
งานก็รวดเร็ว
ฉันพยายามที่จะเรียนรู้วิธีการใช้หางภาพMicrosoft / MSSQL เซิร์ฟเวอร์หน้าต่างนักพัฒนา ตามเอกสารของ 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
ฉันใช้คอนเทนเนอร์ใน Windows 10 และประสบความสำเร็จในการเริ่มต้นพิสูจน์ตัวตนด้วยการรับรองความถูกต้องของ SQL Server และการรันคิวรีกับอินสแตนซ์ที่ใช้ sqlcmd และ SSMS 17.4 บนโฮสต์ windows (เชื่อมต่อกับ localhost หรือ“.”) และการดำเนินงาน SQL สตูดิโอบน mac ติดกับ IP ฉันไม่เห็นปัญหาประสิทธิภาพการทำงานที่เห็นได้ชัดเจนเมื่อเรียกใช้แบบสอบถามด้วยวิธีนี้
ใน SSMS ฉันยังสามารถเรียกดู Object explorer ได้ แต่ถ้าฉันพยายามทำบางอย่างจากเมนูคลิกขวาบนวัตถุใน object explorer เช่นเปิดหน้าต่างพารามิเตอร์อินสแตนซ์หรือแนบฐานข้อมูล SSMS จะไม่แสดงการตอบสนองประมาณ 5 -10 นาทีซึ่งจะแสดงหน้าต่างที่ฉันถามหรือแสดงข้อความข้อผิดพลาดนี้:
ฉันกำลังพยายามทำสคริปต์ PowerShell กับอินสแตนซ์นี้โดยใช้วัตถุ SMO Scripterและดูลักษณะการทำงานแบบเดียวกัน สคริปต์ PS วนลูปผ่านวัตถุในฐานข้อมูลและสคริปต์ให้เป็นไฟล์และในขณะที่ทำงานเพื่อรวบรวมรายการวัตถุที่ค่อนข้างเร็ววัตถุแต่ละรายการใช้เวลา 5-10 นาทีในการสคริปต์ - ช้าเกินกว่าจะใช้งานได้
ฉันมีลางสังหรณ์ว่าพอร์ตที่เปิดเผยเพียงพอร์ตเดียวนั้นไม่เพียงพอและ SMO และ SSMS กำลังพยายามเชื่อมต่อด้วยวิธีที่คล้ายกันซึ่งทำให้พวกเขาช้าลง เป็นไปได้ไหมที่เมื่อเชื่อมต่อกับ localhost เครื่องมือเหล่านี้สันนิษฐานว่ามีช่องทางการสื่อสารอื่นที่มีอยู่ซึ่งปกติแล้วจะไม่ถูกไฟร์วอลล์? มีพารามิเตอร์การเชื่อมต่อเพิ่มเติมที่ฉันสามารถใช้งานได้หรือไม่? ใครสามารถตรวจสอบสมมติฐานของฉันว่า SSMS ใช้ SMO หรืออย่างอื่นเพื่อพูดคุยกับ SQL Server?
UPDATE:ฉันยังคงตรวจสอบอยู่ แต่เป็นไปได้ว่านี่เป็นปัญหานักเทียบท่าที่มีข้อ จำกัด ด้านทรัพยากร สิ่งนี้ทำให้เกิดความสับสนเนื่องจากเอกสารส่วนใหญ่ดูเหมือนจะบ่งบอกว่า Windows Containers ไม่มีข้อ จำกัด ทรัพยากรเริ่มต้น (และสิ่งเหล่านี้ไม่สามารถตั้งค่าได้ใน Docker สำหรับ Windows GUI - สำหรับภาชนะ Linux เท่านั้น ) แต่ดูเหมือนว่าในความเป็นจริงแล้ว Windows คอนเทนเนอร์ที่ทำงานบน Windows 10 จะได้รับการจัดสรร RAM เริ่มต้นที่ 1GB ฉันยังคงพยายามหาวิธีตรวจสอบคอนเทนเนอร์ที่ใช้งานอยู่เพื่อดูการจัดสรร RAM และ CPU ของมัน แต่ต่อไปฉันต้องลองเพิ่มมันจากค่าเริ่มต้นโดยใช้docker run
พารามิเตอร์
การปรับปรุงเพิ่มเติม:ฉันล้มเหลวในการรับตัวชี้วัดที่เชื่อถือได้ชนิดใด ๆ ออกจากตัวเทียบท่าที่บอกฉันว่าซีพียูและหน่วยความจำมีขีด จำกัด สำหรับคอนเทนเนอร์ การวิจัยที่หลากหลายบ่งชี้ว่าคอนเทนเนอร์นักเทียบท่าทั้งสองไม่มีขีด จำกัด หน่วยความจำตามค่าเริ่มต้นหรือว่าพวกเขาทำและเป็น 1GB แต่ทั้งหมดที่ฉันสามารถตรวจสอบได้ในขณะนี้คือdocker stats
ว่าคอนเทนเนอร์ SQL นั้นใช้ระหว่าง 750 และ 850 เมกกะเท่านั้น ฉันพยายามเพิ่มพารามิเตอร์ run เพื่อตั้งค่าหน่วยความจำที่มีให้เป็น 4 gb มันผิดพลาด ดังนั้นฉันจึงหยุดติดตามเธรดการสอบถามนั้นและไปตรวจสอบลำไส้อีกครั้ง: เข้าสู่เซสชัน PowerShell แบบโต้ตอบบนคอนเทนเนอร์ที่ใช้งานจากนั้นเรียกใช้สคริปต์ PowerShell ของฉันที่ลิงก์ด้านบนจากด้านในคอนเทนเนอร์
วิ่งเข้าไปในภาชนะไม่มีปัญหา มันส่องแสงผ่านวัตถุ 2780 ในเวลาเพียงไม่กี่นาที ฉันคิดว่าสิ่งนี้ยืนยันว่าปัญหาเกิดขึ้นกับขอบเขตคอนเทนเนอร์ / โฮสต์ดังนั้นฉันจะดูว่าฉันสามารถเปิดพอร์ต UDP นั้นได้หรือไม่ UPDATE: การเปิดพอร์ต 1434 UDP ไม่ได้ช่วย
การปรับปรุงเพิ่มเติม - การแก้ปัญหาทำได้ไม่เป็นปัญหาข้อ จำกัด ด้านทรัพยากร:ดูเหมือนจะมีปัญหาที่เกี่ยวข้องกับการตั้งค่าการจัดสรรหน่วยความจำขนาดใหญ่สำหรับ Windows container - ฉันได้รับข้อผิดพลาดที่คล้ายกันสำหรับ 3g และ 2g แต่ในที่สุดก็สามารถเริ่มต้นคอนเทนเนอร์ด้วย 1.5 กรัมและ ฉันเห็นความแตกต่างในdocker stats
คอนเทนเนอร์ที่ (ฉันคิดว่า) ยืนยันว่ากำลังรันโดยมีการจัดสรรเริ่มต้นที่ 1GB ในการตั้งค่าเริ่มต้นสถิติชุดการทำงาน PRIV (ซึ่งฉันไม่สามารถหาเอกสารใด ๆ ได้ แต่สิ่งที่ฉันคาดเดาได้ดีที่สุดคือ RAM) อยู่ระหว่าง 700MiB และ 850MiB กับdocker run —memory="1.5g"
ชุดมันประมาณ 1.0GiB ดังนั้นมันจึงขยายตัว แต่ดูเหมือนว่าจะปล่อยให้การจัดสรรว่างมากกว่าที่เคยเป็นมาก่อน ฉันแปลสิ่งนี้ (อาจไม่ถูกต้อง) เพื่อหมายความว่าเซิร์ฟเวอร์นี้ (ซึ่งกำลังทำงานอย่างไม่โหลดและไม่มีฐานข้อมูลผู้ใช้) ไม่ได้อยู่ภายใต้ความกดดันของหน่วยความจำ ฉันตรวจสอบการตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดเพื่อยืนยันว่าได้ตั้งค่าไว้ที่ค่าเริ่มต้นสูงสุด 2PiB
จากนั้นสิ่งต่าง ๆ ก็แปลก ฉันยังคงทดสอบสิ่งต่าง ๆ โดยเรียกใช้สคริปต์ PowerShell ของฉันจากสถานที่ต่าง ๆ เร็วภายในภาชนะชะลอตัวลงบนโฮสต์ จากนั้นฉันก็ RDP ไปที่เครื่อง windows อื่นในเครือข่ายและรันสคริปต์จากเครื่องนั้นเชื่อมต่อกับโฮสต์ Windows 10 ด้วย IP และมันก็เร็วมาก! ดูเหมือนว่าจะสนับสนุนทฤษฎีที่ว่าเมื่อเชื่อมต่อกับบางสิ่งที่ควรจะเป็น localhost SMO พยายามเชื่อมต่อกับ SQL Server โดยใช้อย่างอื่นที่ไม่ใช่พอร์ต 1433 TCP ซึ่งรอการหมดเวลานานก่อนที่จะกลับไปเชื่อมต่อ TCP
ฉันตัดสินใจลองตรวจสอบทฤษฎีนี้โดยการป้อนรายการไฟล์โฮสต์เพื่ออ้างถึง localhost ด้วยชื่ออื่นที่ไม่ใช่ localhost:
127.0.0.1 dockersucks
ฉันเชื่อมต่อ SSMS กับนักเทียบท่าแทน localhost หรือ "." และสิ่งต่าง ๆ ก็เร็วขึ้น การนำทาง Object explorer เป็นปกติและการเปิดพาเนลเช่นแนบฐานข้อมูลหรือคุณสมบัติเซิร์ฟเวอร์เกิดขึ้นเร็วเท่ากับปกติ และเมื่อฉันรันสคริปต์ powershell ของฉันจากโฮสต์ windows 10 โดยใช้ชื่อแทนนี้เป็นชื่อเซิร์ฟเวอร์มันก็เร็วเช่นกัน
ฉันเพิ่มการอัปเดตนี้ไปที่คำถามแทนที่จะเป็นคำตอบเนื่องจากฉันยังคงมองหาคำอธิบายว่าทำไมสิ่งนี้ถึงเกิดขึ้นและหากมีวิธีแก้ไขสำหรับการเชื่อมต่อไปยัง "localhost" ด้วยชื่อนั้น