SMO, SSMS ช้าสำหรับการจัดการ SQL Server ใน Docker เมื่อเชื่อมต่อกับ localhost


9

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 นาทีซึ่งจะแสดงหน้าต่างที่ฉันถามหรือแสดงข้อความข้อผิดพลาดนี้:

ข้อความแสดงข้อผิดพลาด SSMS

ฉันกำลังพยายามทำสคริปต์ 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" ด้วยชื่อนั้น


บางทีนักเทียบท่าของคุณกำลังใช้พลังงานหรือไม่ หากเป็นปัญหาเกี่ยวกับพอร์ตฉันสงสัยว่าคุณจะเห็นว่ามันใช้งานได้ทั้งหมดดังนั้นฉันจะไม่ใช้เวลามากบนถนนสายนั้น
LowlyDBA

ใช่ฉันกำลังคิดเกี่ยวกับสิ่งนั้น แต่ประสิทธิภาพของคิวรีดูเหมือนดีดังนั้นมันจึง จำกัด เฉพาะการกระทำบางประเภทเท่านั้น ฉันยังต้องทดสอบการใช้งาน SMO จากภายในคอนเทนเนอร์และตรวจสอบว่าปัญหาไม่ได้อยู่ที่นั่น
NReilingh

1
ฉันไม่พลาดส่วนนั้น SQL Server ใช้การเชื่อมต่อร่วมกัน ฉันเข้าใจว่าสิ่งนี้น่าผิดหวัง แต่ฉันก็ต้องการสร้างความประทับใจให้คุณเพื่อให้แน่ใจว่าคอนเทนเนอร์ (หรือ "แปลก ๆ Hyper-V lite VM" ในกรณีนี้) มี RAM เพียงพอ สคริปต์ PS ของคุณทำงาน "เร็ว" แต่นาทีที่จะผ่านวัตถุ ~ 3000 นั้นช้าในเครื่องที่มี RAM เพียงพอ (เช่นมากกว่า 2 GB)
Randolph West

1
เพื่อความซื่อสัตย์อย่างสมบูรณ์คุณน่าจะดีกว่าที่จะหมุน Ubuntu Hyper-V VM บนเครื่องของคุณและติดตั้ง SQL Server สำหรับ Linux บนนั้น
Randolph West

1
@bazzilic ฉันอธิบายว่าทำไมในคำตอบของฉัน กรุณาแสดงความคิดเห็นที่นั่นหากคุณต้องการชี้แจง
NReilingh

คำตอบ:


3

นี่น่าจะเป็นปัญหาการขาดแคลน RAM

สิ่งที่ต้องตรวจสอบ:

  • คอนเทนเนอร์มี RAM ขนาด 4 GB หรือไม่ ตรวจสอบคำตอบนี้
  • คุณกำหนดการตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดสำหรับ SQL Server ภายในคอนเทนเนอร์หรือไม่ ทั้งนี้ขึ้นอยู่กับจำนวน RAM SQL Server ที่สามารถมองเห็นในคอนเทนเนอร์สิ่งนี้อาจถูกตั้งค่าเป็นอะไรก็ได้ตั้งแต่ 1 GB ถึง 3.25 GB
  • RAM ของโฮสต์ของคุณหมดหรือไม่และเป็นไปได้ไหมที่ Docker เพจกับดิสก์? ปิดแอปพลิเคชันที่ไม่เกี่ยวข้อง (เว็บเบราว์เซอร์เป็นผู้บริโภค RAM ขนาดใหญ่) SSMS ต้องการ RAM การทำงานประมาณ 1 GB จึงจะใช้ได้
  • จะเร็วกว่านี้หลังจากรีบูตหรือไม่

ถ้าฉันทำสิ่งนี้ด้วยตัวเองฉันจะติดตั้ง Docker Community Edition สำหรับ Windows จากที่เก็บ Dockerแล้วติดตั้งอิมเมจ SQL Server Dockerในลักษณะนั้น

หากการเชื่อมต่ออินเทอร์เน็ตของคุณเร็วพอคุณสามารถดำเนินการภายใน 5 นาทีและสามารถจัดสรรทรัพยากรได้อย่างง่ายดาย

แก้ไข: อาเครือข่าย


ไม่แน่ใจว่าคุณเข้าใจผิดหรือไม่ แต่ฉันไม่ได้ใช้ SSMS ภายในคอนเทนเนอร์ ไม่สามารถทำได้เนื่องจากคอนเทนเนอร์ Windows ไม่รองรับการเชื่อมต่อ RDP หรือ GUI ฉันรู้แล้วว่า SQL Server ไม่ได้ช้า - แต่ฉันต้องคิดออกว่าฉันกำลังหิวโหยคอนเทนเนอร์นักเทียบท่านี้สำหรับทรัพยากรหรือไม่ โฮสต์ Windows 10 ที่ใช้งานคอนเทนเนอร์และ SSMS มี RAM 10GB และ 2 คอร์ แต่ฉันไม่แน่ใจว่าจะได้รับการจัดสรรให้กับคอนเทนเนอร์เท่าใด
NReilingh

คำตอบของฉันถูกเขียนใหม่
Randolph West

ดูการอัพเดต Q สำหรับข้อมูลเพิ่มเติม โปรดทราบว่านี่เป็นงานสร้างอิมเมจคอนเทนเนอร์ของไมโครซอฟท์ดังนั้นฉันคิดว่าเราค่อนข้างปลอดภัยหากว่าการตั้งค่าภายในคอนเทนเนอร์จะไม่เป็นปัญหา
NReilingh

2
กรุณาอย่าตั้งสมมติฐานว่า!
Randolph West

@NReilingh ฉันได้เพิ่ม URL ไปยังคำตอบของฉันเพื่อให้คุณตรวจสอบ-mตัวเลือก
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โดยตรงใน SSMS และแก้ปัญหาของคุณในแบบนั้น การปิด IPv6 ทั้งหมดในระบบโฮสต์ของคุณอาจจะใช้ได้เช่นกัน แต่ฉันไม่แน่ใจว่าวิธีนี้แนะนำให้ใช้กับ Windows 10

ฉันจะพิจารณาคำตอบอื่นเพื่อยอมรับหากใครสามารถบอกฉันได้ว่าทำไม IPv6 ถึงทำให้สิ่งนี้แตก


คุณลองเชื่อมต่อกับ tcp: localhost แล้วหรือยัง? อาจเป็นได้ว่า SSMS / SMO กำลังพยายามหน่วยความจำที่ใช้ร่วมกันหรือการเชื่อมต่อไพพ์ที่มีชื่อเมื่อชื่อคือ localhost หรือ (local) หรือแม้แต่ "" และ :: 1 ฉันไม่รู้ว่า SSMS 17.4 ใช้ SMO ใน Object Explorer หรือไม่ แต่ฉันคิดว่ามันเป็นไปได้
นาย Magoo

@MisterMagoo การป้อนtcp:localhostในฟิลด์ชื่อเซิร์ฟเวอร์ไม่ทำงาน แต่ฉันได้ลองระบุ TCP / IP ในคุณสมบัติการเชื่อมต่ออย่างชัดเจนโดยไม่มีการปรับปรุง ฉันยังคิดว่าปัญหาคือทางเลือกช้า127.0.0.1สำหรับ localhost เมื่อ::1ล้มเหลว ฉันคิดว่า windows แบบสอบถามของฉันทำงานได้เนื่องจากพวกเขารักษาการเชื่อมต่ออยู่ในขณะที่สคริปต์ของฉันที่ใช้ SMO นั้น (อาจ) สร้างการเชื่อมต่อใหม่ซ้ำแล้วซ้ำอีก
NReilingh

1
@NReilingh ฉันเห็นปัญหาเดียวกันนี้ - การแก้ปัญหาและคำอธิบายของคุณมีประโยชน์จริงๆ การกล่าวถึงคอนเทนเนอร์เซิร์ฟเวอร์ sql ของฉันเป็น127.0.0.1 ( ไม่ใช่ localhost ) จากสภาพแวดล้อมโฮสต์ของฉันเป็นวิธีเดียวที่ฉันจะได้รับโฮสต์ไปยังการเชื่อมต่อคอนเทนเนอร์ทำงานได้ตามปกติ
rogersillito
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.