TL; DR : IPv6 루프백 ( ::1
)으로 확인 되는 이름을 통해 SQL Server Docker 컨테이너에 연결하면 SMO 호출이 실제로 느려집니다. 사용하면 127.0.0.1
빠릅니다.
Docker 이미지 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
Windows 10에서 컨테이너를 실행하고 있으며 SQL Server 인증으로 인증하고 Windows 호스트 (localhost 또는 "."에 연결)에서 sqlcmd 및 SSMS 17.4를 사용하여 인스턴스에 대해 쿼리를 실행하고 SQL 작업을 성공적으로 수행했습니다. IP로 연결되는 옆집 맥의 스튜디오. 이 방법으로 쿼리를 실행할 때 눈에 띄는 성능 문제가 없습니다.
SSMS에서 객체 탐색기를 탐색 할 수도 있지만 인스턴스 탐색기 창을 열거 나 데이터베이스를 연결하는 등 객체 탐색기의 객체에서 마우스 오른쪽 버튼 메뉴에서 무언가를 시도하면 SSMS가 약 5에 대한 응답을 표시하지 않습니다. -10 분이되면 요청한 창을 표시하거나이 오류 메시지를 표시합니다.
또한 SMO Scripter object를 사용 하여이 인스턴스에 대해 PowerShell 스크립팅을 시도 하고 동일한 종류의 동작을 확인 하려고합니다 . PS 스크립트는 데이터베이스의 객체를 반복하여 파일로 스크립팅하고, 객체 목록을 비교적 빠르게 수집하는 동안 각 개별 객체는 스크립트를 작성하는 데 5-10 분이 걸리므로 사용하기에는 너무 느립니다.
노출 된 단일 포트로는 충분하지 않으며 SMO와 SSMS는 속도를 늦추는 비슷한 방식으로 연결하려고합니다. 로컬 호스트에 연결할 때 이러한 도구가 일반적으로 방화벽이되지 않는 다른 통신 채널이 있다고 가정 할 수 있습니까? 사용할 수있는 추가 연결 매개 변수가 있습니까? 누구든지 SSMS가 SMO 또는 다른 것을 사용하여 SQL Server와 통신하고 있다는 가정을 확인할 수 있습니까?
업데이트 : 여전히 조사 중이지만 이것이 리소스 제약과 관련된 Docker 문제라는 것이 그럴듯합니다. 대부분의 문서가 Windows Containers에 기본 리소스 제약 조건이 없음을 나타 내기 때문에 혼란 스럽지만 (Windows 컨테이너 의 Docker 에서는 Linux 컨테이너에만 설정할 수 없음 ) 실제로는 Windows 인 것처럼 보입니다. Windows 10에서 실행되는 컨테이너는 1GB의 기본 RAM 할당을 갖습니다. 여전히 실행중인 컨테이너를 검사하여 RAM 및 CPU 할당을 확인하는 방법을 알아 내려고 노력하고 있지만 다음에는 매개 변수를 사용하여 기본값에 관계없이 컨테이너를 늘리려 고합니다 .docker run
추가 업데이트 : 컨테이너에 대해 어떤 CPU 및 메모리 제한이 있는지 알려주는 신뢰할 수있는 메트릭을 도커에서 가져 오는 데 실패했습니다. 다양한 연구에 따르면 도커 컨테이너에는 기본적으로 메모리 제한이 없거나 1GB라는 것이 있지만 현재 확인할 수 docker stats
있는 것은 SQL 컨테이너가 750에서 850 메가 사이 에서만 사용 된다는 것입니다. 사용 가능한 메모리를 4GB로 설정하기 위해 실행 매개 변수를 추가하려고하면 오류가 발생합니다. 그래서 그 스레드를 따라가는 것을 멈추고 다른 용기 검사를 진행했습니다. 실행중인 컨테이너에 대화 형 powershell 세션을 입력 한 다음 컨테이너 내부 에서 위에서 링크 된 powershell 스크립트를 호출 합니다.
컨테이너 내부에서 실행하면 문제가 없었습니다. 불과 2 분만에 2780 개의 물체를 뚫었습니다. 컨테이너 / 호스트 경계에 문제가 있음을 확인하므로 해당 UDP 포트를 열 수 있는지 확인하겠습니다. 업데이트 : 포트 1434 UDP를 여는 것이 도움이되지 않았습니다.
추가 업데이트 — 해결 방법 달성, 리소스 제약 문제가 아님 : Windows 컨테이너에 대해 큰 메모리 할당 설정과 관련된 문제 가있는 것 같습니다. 3g 및 2g에 대해 유사한 오류가 발생했지만 결국 1.5g로 컨테이너를 시작할 수있었습니다. docker stats
컨테이너가 기본 할당 1GB로 실행되고 있음을 확인한 컨테이너 의 차이점을 보았습니다 . 기본 설정에서 PRIV WORKING SET 통계 (문서를 찾을 수는 없지만 RAM은 RAM입니다)는 700MiB와 850MiB 사이입니다. 와docker run —memory="1.5g"
설정하면 약 1.0GiB입니다. 따라서 확장되었지만 이전보다 더 많은 할당을 사용하지 않는 것으로 보입니다. 나는 (아마도 부정확하게)이 서버 (절대적으로 NO로드를 실행하고 사용자 데이터베이스가 없음)가 메모리 압력을 받고 있지 않다는 것을 의미한다고 해석합니다. max server memory 설정을 확인하여 기본 최대 값 인 2PiB로 설정되어 있는지 확인했습니다.
그런 다음 상황이 이상해졌습니다. 다양한 위치에서 powershell 스크립트를 실행하여 여전히 테스트 중입니다. 컨테이너 내부가 빠르며 호스트 속도가 느립니다. 그런 다음 네트워크의 다른 Windows 시스템에 RDP를 연결하고 IP로 Windows 10 호스트에 연결하여 THAT 시스템에서 스크립트를 실행했습니다. 그리고 그것은 빠르다! 이것은 로컬 호스트로 연결되는 것으로 연결될 때 SMO가 포트 1433 TCP 이외의 다른 것을 사용하여 SQL Server에 연결하려고 시도하고 TCP 연결로 돌아 가기 전에 매우 긴 시간 초과를 기다리는 이론을 지원하는 것으로 보입니다.
localhost 이외의 이름으로 localhost를 참조하기 위해 hosts 파일 항목을 입력하여이 이론의 유효성을 검사하기로 결정했습니다.
127.0.0.1 dockersucks
SSMS에서 localhost 또는 "."대신 dockersucks에 연결했는데 즉시 상황이 더 빨랐습니다. 객체 탐색기 탐색은 평소와 같았으며 데이터베이스 연결 또는 서버 속성과 같은 패널을 여는 것이 평소처럼 빠르게 발생했습니다. 그리고이 별칭을 서버 이름으로 사용하여 Windows 10 호스트에서 powershell 스크립트를 실행했을 때도 빠릅니다.
이 문제가 발생하는 이유에 대한 설명을 찾고 있으며 해당 이름으로 "localhost"에 연결하기 위해 수정하는 방법이있는 경우 답변 대신 질문에이 업데이트를 추가했습니다.