SMO, SSMS chậm quản lý SQL Server trong Docker khi kết nối với localhost


9

TL; DR: Khi kết nối với bộ chứa Docker SQL Server của tôi thông qua một tên phân giải thành vòng lặp IPv6 ( ::1), các cuộc gọi SMO rất chậm. Khi sử dụng 127.0.0.1, chúng rất nhanh.


Tôi đang cố gắng học cách sử dụng hình ảnh Docker microsoft / mssql-server-windows-developer . Theo tài liệu của Microsoft, container này chỉ hiển thị cổng 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

Tôi đang chạy container trên Windows 10 và đã khởi động thành công, xác thực bằng xác thực SQL Server và chạy các truy vấn đối với trường hợp sử dụng sqlcmd và SSMS 17.4 trên máy chủ windows (kết nối với localhost hoặc mật. Studio trên máy mac bên cạnh kết nối bằng IP. Tôi thấy không có vấn đề hiệu suất đáng chú ý khi chạy truy vấn theo cách này.

Trong SSMS, tôi cũng có thể duyệt trình thám hiểm đối tượng, nhưng nếu tôi cố gắng làm gì đó từ menu chuột phải trên một đối tượng trong trình thám hiểm đối tượng, như mở cửa sổ tham số phiên bản hoặc đính kèm cơ sở dữ liệu, SSMS không hiển thị phản hồi trong khoảng 5 -10 phút, tại thời điểm đó, nó sẽ hiển thị cửa sổ tôi yêu cầu hoặc hiển thị thông báo lỗi này:

Thông báo lỗi SSMS

Tôi cũng đang cố gắng thực hiện một số kịch bản PowerShell chống lại trường hợp này bằng cách sử dụng đối tượng Scripter SMO và xem loại hành vi tương tự. Tập lệnh PS lặp qua các đối tượng trong cơ sở dữ liệu và tập lệnh chúng để tập tin, và trong khi nó hoạt động để thu thập danh sách các đối tượng tương đối nhanh chóng, mỗi đối tượng riêng lẻ mất 5-10 phút để tập lệnh quá chậm để có thể sử dụng.

Tôi có linh cảm rằng cổng tiếp xúc duy nhất là không đủ và SMO và SSMS đang cố gắng kết nối theo cách tương tự đang làm chậm chúng. Cũng có thể là khi kết nối với localhost, các công cụ này cho rằng có các kênh liên lạc khác hiện tại thường không được tường lửa? Có bất kỳ tham số kết nối bổ sung nào tôi có thể sử dụng không? Bất cứ ai cũng có thể xác nhận giả định của tôi rằng SSMS đang sử dụng SMO hoặc một cái gì đó khác để nói chuyện với SQL Server?


CẬP NHẬT: Tôi vẫn đang điều tra, nhưng có thể đây là vấn đề Docker xung quanh các hạn chế tài nguyên. Điều này gây nhầm lẫn bởi vì hầu hết các tài liệu dường như chỉ ra rằng Windows Container không có bất kỳ ràng buộc tài nguyên mặc định nào (và chúng không thể được đặt trong Docker cho Windows GUI - chỉ dành cho các container Linux ), nhưng có vẻ như trong thực tế, Windows các container chạy trên Windows 10 có phân bổ RAM mặc định là 1GB. Tôi vẫn đang cố gắng tìm ra cách kiểm tra một container đang chạy để xem phân bổ RAM và CPU của nó, nhưng tiếp theo tôi phải thử tăng chúng từ bất kỳ giá trị mặc định nào, sử dụng docker runtham số.


CẬP NHẬT THÊM: Tôi đã không nhận được bất kỳ loại số liệu đáng tin cậy nào ra khỏi docker cho tôi biết CPU và bộ nhớ giới hạn nào có trong bộ chứa. Nghiên cứu khác nhau chỉ ra rằng các bộ chứa docker không có giới hạn bộ nhớ theo mặc định, hoặc chúng có và 1GB, nhưng tất cả những gì tôi có thể xác minh tại thời điểm đó là docker statsbộ chứa SQL chỉ sử dụng từ 750 đến 850 meg và khi nào Tôi cố gắng thêm một tham số chạy để đặt bộ nhớ khả dụng lên 4 gb, nó bị lỗi. Vì vậy, tôi đã dừng theo dõi chuỗi điều tra đó và đi kiểm tra ruột khác: nhập một phiên quyền hạn tương tác trên container đang chạy và sau đó gọi tập lệnh powershell của tôi được liên kết ở trên từ bên trong container.

Chạy bên trong container không có vấn đề gì. Nó thổi qua 2780 vật thể chỉ trong vài phút. Tôi nghĩ điều này xác nhận rằng vấn đề nằm ở ranh giới vùng chứa / máy chủ, vì vậy tôi sẽ xem liệu tôi có thể mở cổng UDP đó không. CẬP NHẬT: Mở cổng 1434 UDP không giúp được.


CẬP NHẬT THÊM CÂU HỎI THƯỜNG GẶP Đã đạt được, Không phải là vấn đề hạn chế tài nguyên: Dường như có vấn đề liên quan đến việc đặt phân bổ bộ nhớ lớn cho các bộ chứa windows - Tôi đã nhận được các lỗi tương tự trong 3g và 2g, nhưng cuối cùng đã có thể khởi động bộ chứa với 1,5g và Tôi DID thấy một sự khác biệt trong docker statscontainer cho (tôi nghĩ) xác nhận rằng nó đang chạy với phân bổ mặc định là 1GB. Trên cài đặt mặc định, chỉ số PRIV WORKING SET (mà tôi không thể tìm thấy bất kỳ tài liệu nào, nhưng tôi đoán tốt nhất là RAM) nằm trong khoảng từ 700MiB đến 850MiB. Vớidocker run —memory="1.5g"thiết lập, khoảng 1.0GiB. Vì vậy, nó đã mở rộng, nhưng dường như để lại nhiều phân bổ miễn phí hơn trước đây. Tôi giải thích điều này (có lẽ không chính xác) có nghĩa là máy chủ này (đang chạy hoàn toàn KHÔNG tải và KHÔNG có cơ sở dữ liệu người dùng) không chịu áp lực bộ nhớ. Tôi đã kiểm tra cài đặt bộ nhớ máy chủ tối đa để xác nhận rằng nó được đặt ở mức tối đa mặc định là 2PiB.

Sau đó, mọi thứ trở nên kỳ lạ. Tôi vẫn đang thử nghiệm mọi thứ bằng cách chạy tập lệnh powershell của mình từ nhiều địa điểm khác nhau. Nhanh chóng bên trong container, chậm trên máy chủ. Sau đó, tôi RDP'd đến một máy tính windows khác trên mạng và chạy tập lệnh từ máy THAT, kết nối với máy chủ Windows 10 của tôi bằng IP. Và nó đã NHANH CHÓNG! Điều này dường như ủng hộ lý thuyết rằng khi kết nối với thứ gì đó được coi là localhost, SMO đang cố gắng kết nối với SQL Server bằng cách sử dụng một cái gì đó ngoài cổng 1433 TCP, chờ một thời gian rất lâu trước khi quay lại kết nối TCP.

Tôi quyết định thử xác nhận lý thuyết này bằng cách nhập một mục nhập tệp máy chủ để tham chiếu localhost bằng một tên khác ngoài localhost:

        127.0.0.1       dockersucks

Tôi đã kết nối trong SSMS với dockersucks thay vì localhost hoặc ".", Và ngay lập tức mọi thứ nhanh hơn. Điều hướng trình thám hiểm đối tượng giống như bình thường và việc mở các bảng như đính kèm cơ sở dữ liệu hoặc máy chủ xảy ra nhanh như bình thường. Và, khi tôi chạy tập lệnh powershell của mình từ máy chủ windows 10 sử dụng bí danh này làm tên máy chủ, nó cũng rất nhanh.

Tôi đã thêm bản cập nhật này vào câu hỏi thay vì câu trả lời vì tôi vẫn đang tìm lời giải thích tại sao điều này xảy ra và nếu có cách khắc phục nó cho các kết nối với "localhost" bằng tên đó.


Có lẽ ví dụ docker của bạn chỉ được cung cấp năng lượng? Nếu đó là một vấn đề về cổng thì tôi nghi ngờ bạn sẽ thấy nó hoạt động hoàn toàn, vì vậy tôi sẽ không dành nhiều thời gian trên con đường đó.
LowlyDBA

Vâng tôi đã suy nghĩ về điều đó, nhưng hiệu năng truy vấn có vẻ tốt nên dường như chỉ giới hạn ở một số loại hành động nhất định. Tôi cũng cần kiểm tra việc chạy các công cụ SMO từ bên trong container và xác minh rằng vấn đề không có ở đó.
NRzingh

1
Tôi đã không bỏ lỡ phần đó. SQL Server sử dụng kết nối tổng hợp. Tôi nhận thấy rằng điều này thật khó chịu, nhưng tôi cũng muốn gây ấn tượng với bạn để đảm bảo rằng container (hoặc "VM lite Hyper-V kỳ lạ" trong trường hợp này) có đủ RAM. Tập lệnh PS của bạn chạy "nhanh", nhưng vài phút để chạy qua ~ 3000 đối tượng thì chậm trong một máy có đủ RAM (tức là hơn 2 GB).
Randolph West

1
Thành thật mà nói, có lẽ tốt hơn hết là bạn nên khởi động máy ảo Ubuntu Hyper-V trên máy của mình và cài đặt SQL Server cho Linux.
Randolph West

1
@bazzilic Tôi giải thích tại sao trong câu trả lời của tôi. Hãy bình luận ở đó nếu bạn cần làm rõ.
NRzingh

Câu trả lời:


3

Đây rất có thể là một vấn đề đói RAM.

Những điều cần kiểm tra:

  • Liệu container có 4 GB RAM được gán cho nó? Kiểm tra câu trả lời này .
  • Bạn đã cấu hình cài đặt Bộ nhớ máy chủ tối đa cho SQL Server bên trong vùng chứa chưa? Tùy thuộc vào lượng RAM SQL Server có thể nhìn thấy trong bộ chứa, điều này có thể được đặt thành bất cứ thứ gì từ 1 GB đến 3,25 GB.
  • RAM của máy chủ của bạn đã sử dụng hết chưa, và có khả năng Docker đang phân trang vào đĩa không? Đóng mọi ứng dụng không liên quan (trình duyệt web là khách hàng lớn của RAM). SSMS cần khoảng 1 GB RAM hoạt động để có thể sử dụng được.
  • Đây có phải là nhanh hơn sau khi khởi động lại?

Nếu tôi đang tự làm việc này, tôi sẽ cài đặt Docker Community Edition cho Windows từ cửa hàng Docker , sau đó cài đặt hình ảnh SQL Server Docker theo cách đó.

Nếu kết nối Internet của bạn đủ nhanh, bạn có thể khởi động trong vòng dưới 5 phút và có thể phân bổ tài nguyên theo cách dễ dàng hơn nhiều.

EDIT: Ah, mạng.


Không chắc chắn nếu bạn hiểu nhầm điều này, nhưng tôi không chạy SSMS bên trong container. Điều đó là không thể, vì các bộ chứa Windows hiện không hỗ trợ các kết nối RDP hoặc GUI. Tôi đã biết SQL Server không chậm - nhưng tôi cần phải biết liệu tôi có đang bỏ đói bộ chứa docker này để lấy tài nguyên không. Máy chủ Windows 10 chạy container và SSMS có 10GB RAM và 2 lõi, nhưng tôi không chắc có bao nhiêu được phân bổ cho container.
NRzingh

Câu trả lời của tôi đã được viết lại
Randolph West

Xem cập nhật Q để biết thêm thông tin. Lưu ý rằng đây là bản dựng hình ảnh thùng chứa riêng của microsoft, vì vậy tôi nghĩ rằng chúng tôi khá an toàn khi cho rằng các cài đặt trong vùng chứa sẽ không thành vấn đề.
NRzingh

2
Xin đừng giả định điều đó!
Randolph West

@NR roomh Tôi đã thêm một URL vào câu trả lời của tôi để bạn điều tra -mtùy chọn.
Randolph West

3

Sự khác biệt chính ở đây là liệu SSMS / SMO đang cố gắng kết nối với IPv4 hay IPv6. Nếu bạn thực hiện một ping localhostdấu nhắc lệnh, bạn sẽ thấy nó giải quyết ::1, tương đương với IPv6 127.0.0.1. Kết nối để .làm điều tương tự.

docker runLệnh của bạn chỉ hiển thị cổng 1433 trên 127.0.0.1. Bạn có thể xác minh điều này bằng cách chạy netstat -ađể xem cổng nào khả dụng.

Bí danh tệp máy chủ mà bạn đã tạo giải quyết trực tiếp 127.0.0.1, nhưng bạn không cần nó, vì bạn có thể kết nối 127.0.0.1trực tiếp trong SSMS và giải quyết vấn đề của mình theo cách đó. Tắt IPv6 hoàn toàn trên hệ thống máy chủ của bạn có thể cũng sẽ hoạt động, nhưng tôi không chắc nó được khuyến khích như thế nào trên Windows 10.

Tôi sẽ xem xét một câu trả lời thay thế để chấp nhận nếu có ai có thể cho tôi biết lý do IPv6 khiến điều này bị phá vỡ.


Bạn đã thử kết nối với tcp: localhost chưa? Có thể SSMS / SMO đang cố gắng kết nối bộ nhớ được chia sẻ hoặc kết nối đường ống được đặt tên khi tên là localhost hoặc (cục bộ) hoặc thậm chí là "." và 1. Tôi không biết nếu SSMS 17.4 chắc chắn sử dụng SMO trong Object Explorer, nhưng tôi nghĩ điều đó là có thể.
Magoo

@MisterMagoo Nhập tcp:localhostvào trường tên máy chủ dường như không hoạt động, nhưng tôi đã cố gắng chỉ định rõ ràng TCP / IP trong các thuộc tính kết nối mà không cải thiện. Tôi vẫn nghĩ rằng vấn đề là dự phòng chậm 127.0.0.1cho localhost khi ::1thất bại. Tôi nghĩ các cửa sổ truy vấn của tôi đã hoạt động vì chúng đang duy trì kết nối, trong khi tập lệnh của tôi sử dụng SMO là (có lẽ) tạo ra các kết nối mới nhiều lần.
NRzingh

1
@NR roomh Tôi đang gặp vấn đề tương tự - cách khắc phục và giải thích của bạn thực sự hữu ích. Địa chỉ container máy chủ sql của tôi là 127.0.0.1 ( không phải localhost ) từ môi trường máy chủ của tôi là cách duy nhất tôi có thể khiến máy chủ lưu trữ kết nối container hoạt động bình thường.
rogersillito
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.