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 프로토콜에 스트레스 관련 문제를 야기시킬 수 있지만 이에 대해서는 설명하지 않습니다. 이 문서는 고급 사용자를 위한 것입니다. 이 문서의 항목이 이해가 되지 않을 경우 TCP/IP 소켓에 대한 설명서를 참조하는 것이 좋습니다.
SQL Server 드라이버에는 항상 풀링을 사용하는 것이 좋습니다. 풀링을 사용하면 SQL Server 드라이버를 사용할 때 클라이언트측과 SQL Server측 모두에서 전반적인 성능이 크게 향상되고 SQL Server를 실행하는 컴퓨터에 대한 네트워크 트래픽도 상당히 줄어듭니다. 예를 들어, 풀링을 설정한 상태에서 SQL Server 연결을 20,000번 열고 닫는 예제 테스트에서 총 23,520바이트의 네트워크 작업에 대해 약 160개의 TCP/IP 네트워크 소켓을 사용했지만 풀링을 해제한 상태에서는 동일한 예제 테스트가 총 27,209,622바이트의 네트워크 작업에 대해 225,129개의 TCP/IP 네트워크 소켓을 생성했습니다.
SQL Server 네트워크 라이브러리에 이러한 스트레스 관련 TCP/IP 소켓 문제가 나타날 경우 SQL Server를 실행하는 컴퓨터에 연결하려고 하면 다음 오류 메시지 중 하나 이상이 나타날 수 있습니다.
SQL Server가 없거나 액세스가 거부되었습니다.
시간이 초과되었습니다.
일반 네트워크 오류입니다.
SQL Server에 다른 문제가 발생할 때도 이러한 특정 오류 메시지가 나타날 수 있습니다. 예를 들어, SQL Server를 실행하는 원격 컴퓨터가 종료되거나 TCP/IP 소켓을 전혀 수신 대기하지 않는 경우, 네트워크 케이블이 뽑혀서 SQL Server를 실행하는 컴퓨터에 대한 네트워크 연결이 끊어진 경우, DNS 확인 문제가 있는 경우 이러한 오류 메시지가 나타날 수 있습니다. 기본적으로 SQL Server를 실행하는 컴퓨터에 대해 클라이언트가 TCP/IP 소켓을 열 수 없도록 하는 문제는 오류 메시지를 수반할 수 있습니다. 그러나 스트레스 관련 소켓 문제가 있으면 스트레스가 증가하거나 감소함에 따라 문제가 간헐적으로 발생합니다. 컴퓨터가 오류 없이 몇 시간 동안 실행되다가 오류가 한 두 번 발생한 다음 다시 여러 시간 동안 오류 없이 실행될 수 있습니다. 또한 이 문제가 있으면 SQL Server에 대한 일반 연결은 한 인스턴스에서 작동하고 다음 인스턴스에서는 실패하고 그 다음 인스턴스에서는 다시 작동하게 됩니다. 즉, 스트레스 관련 소켓 문제는 대개 산발적으로 발생하지만 SQL Server의 실제 네트워크 연결 문제는 산발적으로 발생하지 않습니다.
SQL Server TCP/IP 프로토콜을 사용하는 동안 풀링을 해제하면 일반적으로 두 가지 주요 스트레스 관련 문제가 발생합니다. 클라이언트 컴퓨터에 익명 포트가 없거나 SQL Server를 실행하는 컴퓨터에서 기본
WinsockListenBacklog 설정을 초과할 수 있습니다.
익명 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
319502 (http://support.microsoft.com/kb/319502/) PRB: IMAP 연결 제한을 늘린 후 익명 포트를 통해 연결하려고 하면 "WSAEADDRESSINUSE" 오류 메시지가 나타난다
위로 가기
MaxUserPort 및 TcpTimedWaitDelay 설정 조정
연결 풀링을 사용하지 않고 SQL Server를 실행하는 원격 컴퓨터에 대한 연결을 빠르게 열고 닫는 클라이언트 컴퓨터에 대해서만
MaxUserPort 및
TcpTimedWaitDelay 설정을 적용할 수 있습니다. 예를 들어, 이러한 설정은 많은 수의 들어오는 HTTP 요청을 서비스하고 SQL Server를 실행하는 원격 컴퓨터에 대한 연결을 열고 닫으며 풀링이 해제된 상태에서 TCP/IP 프로토콜을 사용하는 인터넷 정보 서비스(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 소켓 집합이 시간 초과될 때까지 새로운 소켓 연결 시도는 실패합니다.
클라이언트측에서는 풀링이 해제되었을 때 319502에서 설명하는
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이며 설정된 연결 세 개와 연결 두 개가 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 주소에 대한 약 4,000개의 연결이 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를 실행하는 컴퓨터에 이러한 설정이 적용되지 않습니다.