요약
SQL Server ODBC 드라이버, SQL Server OLE DB 공급자 또는 System.Data.SqlClient 관리 공급자를 사용하는 경우 해당 API(응용 프로그래밍 인터페이스)를 사용하여 연결 풀링을 사용하지 않도록 설정할 수 있습니다. 풀링을 사용하지 않도록 설정하면 애플리케이션에서 연결을 자주 열고 닫는 경우 기본 SQL Server 네트워크 라이브러리에 대한 스트레스가 증가할 수 있습니다. 이 문서에서는 이러한 조건에서 조정해야 할 수 있는 특정 TCP/IP 설정에 대해 설명합니다.
추가 정보
풀링을 끄면 기본 SQL Server 네트워크 드라이버가 SQL Server를 실행하는 컴퓨터에 대한 새 소켓 연결을 빠르게 열었다가 닫을 수 있습니다. 더 높은 스트레스 수준을 처리하려면 운영 체제 및 SQL Server를 실행하는 컴퓨터의 기본 TCP/IP 소켓 설정을 변경해야 할 수 있습니다.
이 문서에서는 TCP/IP 프로토콜을 사용할 때 SQL Server 네트워크 라이브러리에 영향을 주는 설정만 설명합니다. 풀링을 해제하면 명명된 파이프와 같은 다른 SQL Server 프로토콜에서 스트레스 관련 문제가 발생할 수도 있지만 이 문서에서는 이 항목에 대해 설명하지 않습니다. 이 문서는 고급 사용자만을 위한 것입니다. 이 문서의 topics 이해하지 못하는 경우 TCP/IP 소켓에 대한 좋은 책을 참고하는 것이 좋습니다.
Microsoft는 항상 SQL Server 드라이버와 함께 풀링을 사용할 것을 강력히 권장합니다. 풀링을 사용하면 SQL Server 드라이버를 사용할 때 클라이언트 쪽과 SQL Server 쪽 모두에서 전반적인 성능이 크게 향상됩니다. 또한 풀링을 사용하면 SQL Server를 실행하는 컴퓨터에 대한 네트워크 트래픽이 크게 줄어듭니다. 예를 들어 20,000개의 SQL Server 연결을 사용한 샘플 테스트는 풀링을 사용하도록 설정한 상태에서 열리고 닫히며 총 23,520바이트의 네트워크 활동에 대해 약 160개의 TCP/IP 네트워크 패킷을 사용했습니다. 풀링을 사용하지 않도록 설정한 상태에서 동일한 샘플 테스트에서 225,129개의 TCP/IP 네트워크 패킷(총 27,209,622바이트의 네트워크 활동)이 생성되었습니다.
SQL Server 네트워크 라이브러리에서 이러한 스트레스 관련 TCP/IP 소켓 문제가 나타나면 SQL Server를 실행하는 컴퓨터에 연결하려고 할 때 다음 오류 메시지 중 하나 이상이 표시될 수 있습니다.
참고
SQL Server가 존재하지 않거나 액세스가 거부됨
참고
제한 시간 만료됨
참고
일반 네트워크 오류
참고
TCP 공급자: 일반적으로 각 소켓 주소(프로토콜/네트워크 주소/포트)를 한 번만 사용할 수 있습니다.
SQL Server에 다른 문제가 발생하는 경우에도 이러한 특정 오류 메시지가 나타날 수 있습니다. 예를 들어 SQL Server를 실행하는 원격 컴퓨터가 종료된 경우, SQL Server를 실행하는 원격 컴퓨터가 TCP/IP 소켓을 전혀 수신 대기하지 않는 경우, 실행 중인 컴퓨터에 대한 네트워크 연결이 끊어지는 경우 이러한 오류 메시지가 나타날 수 있습니다 네트워크 케이블이 뽑히거나 DNS 확인 문제가 있어 SQL Server가 끊어졌습니다. 기본적으로 클라이언트가 SQL Server를 실행하는 컴퓨터에 대해 TCP/IP 소켓을 열지 못하게 하는 모든 원인으로 인해 오류 메시지가 나타날 수도 있습니다. 그러나 스트레스 관련 소켓 문제의 경우 스트레스가 상승 및 하강하면서 문제가 간헐적으로 발생합니다. 컴퓨터가 오류 없이 몇 시간 동안 실행되다가 오류가 한두 번 발생하고 오류 없이 몇 시간 더 컴퓨터가 실행될 수 있습니다. 또한 이 문제가 발생하면 SQL Server에 대한 일반 연결이 한 순간에 작동하고 다음 순간에 실패했다가 다음 순간에 다시 작동합니다. 즉, 스트레스 관련 소켓 문제는 일반적으로 산발적으로 발생하지만 SQL Server의 실제 네트워크 연결 문제는 일반적으로 산발적으로 발생하지 않습니다.
SQL Server TCP/IP 프로토콜을 사용하는 동안 풀링을 사용하지 않도록 설정하면 일반적으로 두 가지 주요 스트레스 관련 문제가 발생합니다. 클라이언트 컴퓨터의 익명 포트가 부족하거나 SQL Server를 실행하는 컴퓨터의 기본 WinsockListenBacklog 설정을 초과할 수 있습니다.
익명 포트에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하세요.
319502 PRB: IMAP 연결 제한을 늘린 후 익명 포트를 통해 연결하려고 하면 'WSAEADDRESSINUSE' 오류 메시지가 나타납니다.
MaxUserPort 및 TcpTimedWaitDelay 설정 조정
MaxUserPort 및 TcpTimedWaitDelay 설정은 연결 풀링을 사용하지 않고 SQL Server를 실행하는 원격 컴퓨터에 대한 연결을 빠르게 열고 닫는 클라이언트 컴퓨터에만 적용됩니다. 예를 들어 이러한 설정은 많은 수의 들어오는 HTTP 요청을 처리하고 풀링을 사용하지 않도록 설정된 TCP/IP 프로토콜을 사용하여 SQL Server를 실행하는 원격 컴퓨터에 대한 연결을 열고 닫는 IIS(인터넷 정보 서비스) 서버에 적용할 수 있습니다. 풀링을 사용하도록 설정한 경우 MaxUserPort 및 TcpTimedWaitDelay 설정을 조정할 필요가 없습니다.
TCP/IP 프로토콜을 사용하여 SQL Server를 실행하는 컴퓨터에 대한 연결을 열면 기본 SQL Server 네트워크 라이브러리가 SQL Server를 실행하는 컴퓨터에 대한 TCP/IP 소켓을 엽니다. 이 소켓을 열면 SQL Server 네트워크 라이브러리는 SO_REUSEADDR TCP/IP 소켓 옵션을 사용하도록 설정하지 않습니다. SO_REUSEADDR 소켓 설정에 대한 자세한 내용은 MSDN(Microsoft Developer Network)의 "Setsockopt" 항목을 참조하세요.
SQL Server 네트워크 라이브러리는 보안상의 이유로 SO_REUSEADDR TCP/IP 소켓 옵션을 특별히 활성화하지 않습니다. SO_REUSEADDR 사용하도록 설정하면 악의적인 사용자가 클라이언트 포트를 가로채어 SQL Server하고 클라이언트가 제공하는 자격 증명을 사용하여 SQL Server 실행되는 컴퓨터에 액세스할 수 있습니다. 기본적으로 SQL Server 네트워크 라이브러리는 SO_REUSEADDR 소켓 옵션을 사용하도록 설정하지 않으므로 클라이언트 측의 SQL Server 네트워크 라이브러리를 통해 소켓을 열고 닫을 때마다 소켓이 4분 동안 TIME_WAIT 상태가 됩니다. 풀링이 사용하지 않도록 설정된 상태에서 TCP/IP를 통해 SQL Server 연결을 빠르게 열고 닫는 경우 TCP/IP 소켓을 빠르게 열고 닫는 것입니다. 즉, 각 SQL Server 연결에는 하나의 TCP/IP 소켓이 있습니다. 4분 이내에 4,000개의 소켓을 빠르게 열고 닫으면 클라이언트 익명 포트의 기본 최대 설정에 도달하고 기존 TIME_WAIT 소켓 집합이 시간 초과될 때까지 새 소켓 연결 시도가 실패합니다.
클라이언트 쪽에서는 풀링을 사용하지 않도록 설정한 경우 Q319502에서 설명한 MaxUserPort 및 TcpTimedWaitDelay 설정을 늘려야 할 수 있습니다. 이러한 값의 설정은 클라이언트 측에서 발생하는 SQL Server 연결 열기 및 닫기 수에 따라 결정됩니다. 클라이언트 컴퓨터에서 Netstat 도구를 사용하여 TIME_WAIT 상태에 있는 클라이언트 포트 수를 검사할 수 있습니다. 다음과 같이 -n 플래그를 사용하여 Netstat 도구를 실행하고 TIME_WAIT 상태인 SQL Server IP 주소에 대한 클라이언트 소켓 수를 계산합니다. 이 예에서 SQL Server 실행 중인 원격 컴퓨터의 IP 주소는 10.10.10.20이고, 클라이언트 컴퓨터의 IP 주소는 10.10.10.10이며, 3개의 설정된 연결과 2개의 연결이 TIME_WAIT 상태입니다.
C:\>netstat -n
Active Connections
Proto Local Address Foreign Address State
TCP 10.10.10.10:2000 10.10.10.20:1433 ESTABLISHED
TCP 10.10.10.10:2001 10.10.10.20:1433 ESTABLISHED
TCP 10.10.10.10:2002 10.10.10.20:1433 ESTABLISHED
TCP 10.10.10.10:2003 10.10.10.20:1433 TIME_WAIT
TCP 10.10.10.10:2004 10.10.10.20:1433 TIME_WAIT
netstat -n을 실행하고 SQL Server실행 중인 대상 컴퓨터의 IP 주소에 대한 4000개에 가까운 연결이 TIME_WAIT 상태인 경우 클라이언트 익명 포트가 부족하지 않도록 기본 MaxUserPort 설정을 늘리고 TcpTimedWaitDelay 설정을 줄일 수 있습니다. 예를 들어 MaxUserPort 설정을 20000으로 설정하고 TcpTimedWaitDelay 설정을 30으로 설정할 수 있습니다. TcpTimedWaitDelay 설정이 낮을수록 소켓이 TIME_WAIT 상태에서 대기하는 시간이 줄어듭니다. MaxUserPort 설정이 높을수록 TIME_WAIT 상태에서 더 많은 소켓을 가질 수 있습니다.
MaxUserPort 또는 TcpTimedWaitDelay 설정을 조정하는 경우 새 설정이 적용되려면 Microsoft Windows를 다시 시작해야 합니다. MaxUserPort 및 TcpTimedWaitDelay 설정은 TCP/IP 소켓을 통해 SQL Server를 실행하는 컴퓨터와 통신하는 모든 클라이언트 컴퓨터에 적용됩니다. 이러한 설정은 SQL Server를 실행하는 로컬 컴퓨터에 로컬 TCP/IP 소켓 연결을 만들지 않는 한 SQL Server를 실행하는 컴퓨터에 설정되어 있다면 아무런 영향을 주지 않습니다.
참고 MaxUserPort 설정을 조정하는 경우 SQL Server 브라우저 서비스(sqlbrowser.exe)에서 사용할 수 있도록 포트 1434를 예약하는 것이 좋습니다. 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하세요.
812873 Windows Server 2003 또는 Windows 2000 Server를 실행하는 컴퓨터에서 사용 후 임시 포트 범위를 예약하는 방법
WinsockListenBacklog 설정 조정
이 SQL Server 관련 레지스트리 설정에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하세요.
154628 INF: 여러 TCP\IP 연결 요청이 있는 SQL 로그 17832
SQL Server 네트워크 라이브러리가 TCP/IP 소켓에서 수신 대기할 때 SQL Server 네트워크 라이브러리는 Winsock 수신 대기 API를 사용합니다. 수신 대기 API의 두 번째 매개 변수는 소켓에 허용되는 백로그입니다. 이 백로그는 수신기에 대해 보류 중인 연결의 최대 큐 길이를 나타냅니다. 큐 길이가 이 최대 길이를 초과하면 SQL Server 네트워크 라이브러리는 추가 TCP/IP 소켓 연결 시도를 즉시 거부합니다. 또한 SQL Server 네트워크 라이브러리는 ACK+RESET 패킷을 보냅니다.
SQL Server 2000에서는 기본 수신 대기 백로그 설정 5를 사용합니다. 즉, 수신 API가 실행 중인 컴퓨터에서 TCP/IP 프로토콜 수신 스레드를 설정할 때 실행 SQL Server중인 컴퓨터가 값 5를 수신 Winsock API의 백로그 매개 변수로 SQL Server 전달합니다. WinsockListenBacklog 레지스트리 키를 조정하여 이 매개 변수에 전달할 다른 값을 지정할 수 있습니다. SQL Server 2005부터 네트워크 라이브러리는 SOMAXCONN 값을 수신 대기 API에 백로그 설정으로 전달합니다. SOMAXCONN을 통해 Winsock 공급자는 이 설정에 대해 최대한의 합리적인 값을 설정할 수 있습니다. 따라서 WinsockListenBacklog 레지스트리 키는 SQL Server 2005에서 더 이상 사용되지 않거나 필요하지 않습니다.
백로그 설정은 다음과 같이 작동합니다. 임의 서비스가 들어오는 TCP/IP 소켓 요청을 수신한다고 가정해 보겠습니다. 백로그 설정을 5로 설정하고 많은 소켓 연결 요청이 지속적으로 스트리밍되는 경우 서비스는 들어오는 요청에 빠르게 응답하지 못할 수 있습니다. 이 시점에서 TCP/IP 소켓 계층은 백로그 큐에 들어오는 요청을 큐에 대기시키고 서비스는 나중에 이 큐에서 요청을 끌어와 들어오는 소켓 연결 요청을 처리할 수 있습니다. 큐가 가득 차면 TCP/IP 소켓 계층은 ACK+RESET 패킷을 클라이언트로 다시 보내어 들어오는 추가 소켓 요청을 즉시 거부합니다. 백로그 큐 크기를 늘리면 요청이 거부되기 전에 TCP/IP 소켓 계층이 큐에 대기하는 보류 중인 소켓 연결 요청 수가 증가합니다.
WinsockListenBacklog 설정은 SQL Server에만 적용됩니다. SQL Server는 SQL Server 서비스가 처음 시작될 때 이 레지스트리 설정을 읽으려고 시도합니다. 이 설정이 없으면 기본값 5가 사용됩니다. 레지스트리 설정이 있는 경우 SQL Server는 설정을 읽고 SQL Server 내에서 TCP/IP 소켓 수신 스레드가 설정될 때 WinSock API 수신 대기가 호출될 때 제공된 값을 백로그 설정으로 사용합니다.
이 문제가 발생했는지 확인하려면 클라이언트 또는 SQL Server를 실행하는 컴퓨터에서 네트워크 모니터 추적을 실행하고 ACK+RESET으로 즉시 거부되는 소켓 연결 요청을 찾을 수 있습니다. 네트워크 모니터에서 TCP/IP 패킷을 검사하는 경우 이 문제가 발생할 때 다음과 같은 패킷이 표시됩니다.
Frame: Base frame properties
ETHERNET: EType = Internet IP (IPv4)
IP: Protocol = TCP - Transmission Control; Packet ID = 40530; Total IP Length = 40; Options = No Options
TCP: Control Bits: .A.R.., len: 0, seq: 0-0, ack:3409265780, win: 0, src: 1433 dst: 4364
TCP: Source Port = 0x0599
TCP: Destination Port = 0x110C
TCP: Sequence Number = 0 (0x0)
TCP: Acknowledgement Number = 3409265780 (0xCB354474)
TCP: Data Offset = 20 bytes
TCP: Flags = 0x14 : .A.R..
TCP: ..0..... = No urgent data
TCP: ...1.... = Acknowledgement field significant
TCP: ....0... = No Push function
TCP: .....1.. = Reset the connection
TCP: ......0. = No Synchronize
TCP: .......0 = Not the end of the data
TCP: Window = 0 (0x0)
TCP: Checksum = 0xF1E7
TCP: Urgent Pointer = 0 (0x0)
원본 포트는 0x599 또는 10진수 1433입니다. 즉, 패킷은 SQL Server를 실행하고 기본 포트 1433에서 실행되는 일반적인 컴퓨터에서 가져옵니다. 또한 승인 필드가 중요하고 연결 플래그 재설정이 설정되었습니다. 네트워크 모니터 추적을 필터링하는 데 익숙한 경우 16진수 0x14 사용하여 TCP 플래그 값을 필터링하여 네트워크 모니터 추적에서 ACK+RESET 패킷만 볼 수 있습니다.
SQL Server를 실행하는 컴퓨터가 전혀 실행되고 있지 않거나 SQL Server를 실행하는 컴퓨터가 TCP/IP 프로토콜을 수신하지 않는 경우에도 유사한 ACK+RESET 패킷이 표시될 수 있으므로 ACK+RESET 패킷이 표시된다고 해서 이 문제가 발생한다는 확실한 확인은 아닙니다. WinsockListenBacklog가 너무 낮으면 일부 연결 시도는 허용 패킷을 수신하고 일부 연결은 같은 시간 내에 즉시 ACK+RESET 패킷을 수신합니다.
매우 드문 경우지만 클라이언트 컴퓨터에서 풀링을 사용하도록 설정한 경우에도 이 설정을 조정해야 할 수 있습니다. 예를 들어 많은 클라이언트 컴퓨터가 SQL Server를 실행하는 단일 컴퓨터와 통신하는 경우 풀링을 사용하도록 설정한 경우에도 특정 시간에 많은 수의 동시 들어오는 연결 시도가 발생할 수 있습니다.
참고 WinsockListenBacklog 설정을 조정하는 경우 이 설정을 적용하기 위해 Windows를 다시 시작할 필요가 없습니다. 설정이 적용되려면 SQL Server 서비스를 중지했다가 다시 시작하기만 하면 됩니다. WinsockListenBacklog 레지스트리 설정은 SQL Server를 실행하는 컴퓨터에만 적용됩니다. 이는 SQL Server와 통신하는 클라이언트 컴퓨터에는 영향을 주지 않습니다.