웹 응용 프로그램에서 웹 서비스를 호출할 때의 성능 ASP.NET 있습니다.

이 문서에서는 응용 프로그램에서 웹 서비스를 호출할 때 발생하는 성능 문제를 해결하는 Microsoft ASP.NET 제공합니다.

원래 제품 버전:   ASP.NET
원래 KB 번호:   821268

증상

웹 서비스 응용 프로그램에서 웹 서비스를 호출할 ASP.NET, 성능 저하는 불량 및 과부하 상태가 될 수 있습니다. 클라이언트는 요청의 응답이 중지되거나 실행 시간이 오래 걸릴 수 있습니다. 문제가 있는 것으로 의심되는 경우 작업 프로세스가 재생될 수 있습니다.

메서드를 호출할 때 다음과 같은 예외 오류 메시지가 표시될 수 HttpWebRequest.GetResponse 있습니다.

"System.InvalidOperationException: ThreadPool 개체에 작업을 완료할 수 있는 스레드가 충분하지 않습니다."

브라우저에서 다음과 같은 예외 오류 메시지가 표시될 수도 있습니다.

"HttpException(0x80004005): 요청 시간이 지날 수 있습니다."

참고

이 문서는 직접 요청을 하는 응용 HttpWebRequest 프로그램에도 적용됩니다.

원인

이 문제는 호출이 요청을 ASP.NET 수 있는 작업 스레드 및 완료 포트 스레드 수를 제한하기 때문에 발생할 수 있습니다.

일반적으로 웹 서비스에 대한 호출은 하나의 Worker 스레드를 사용하여 요청을 보내는 코드와 웹 서비스에서 콜백을 수신하는 하나의 완료 포트 스레드를 실행합니다. 그러나 요청이 리디렉션되거나 인증이 필요한 경우 호출에 2개의 근로자 스레드와 2개의 완료 포트 스레드가 사용될 수 있습니다. 따라서 여러 웹 서비스 호출이 동시에 발생할 때 관리되는 모든 사용자가 관리할 ThreadPool 수 있습니다.

예를 들어 는 10개로 제한되고 10개 작업자 스레드가 모두 현재 콜백 실행을 기다리는 코드를 실행하고 있는 경우를 ThreadPool 가정해 보겠습니다. 스레드를 사용할 수 있도록 될 때까지 에 대기 중인 모든 작업 항목이 차단되어 콜백을 실행할 ThreadPool 수 없습니다.

또 다른 잠재적인 다투기 원본은 네임스페이스가 연결 수를 제한하는 데 사용하는 매개 maxconnection System.Net 변수입니다. 일반적으로 이 제한은 예상대로 작동합니다. 그러나 많은 응용 프로그램이 동시에 단일 IP 주소에 대한 많은 요청을 시도하는 경우 스레드가 사용 가능한 연결을 대기해야 할 수 있습니다.

해결 방법

이러한 문제를 해결하기 위해 상황에 가장 맞게Machine.config매개 변수를 조정할 수 있습니다.

  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • maxconnection
  • executionTimeout

이러한 문제를 성공적으로 해결하기 위해 다음 작업을 수행하십시오.

  • 동시에 실행할 ASP.NET 수 있는 요청 수를 CPU당 약 12개로 제한합니다.
  • 웹 서비스 콜백이 의 스레드를 자유롭게 사용할 수 ThreadPool 있습니다.
  • 매개 변수에 적절한 값을 maxconnections 선택합니다. 선택한 IP 주소 및 사용되는 AppDomain 수를 기초로 합니다.

참고

CPU당 ASP.NET 수를 12개로 제한하는 것이 좋습니다. 그러나 이 제한은 대부분의 응용 프로그램에서 잘 작동할 수 있는 것으로 입증되었습니다.

MaxWorkerThreads 및 maxIoThreads

ASP.NET 다음 두 가지 구성 설정을 사용하여 사용되는 최대 Worker 스레드 및 완료 스레드 수를 제한합니다.

<processModel maxWorkerThreads="20" maxIoThreads="20">

매개 변수와 매개 변수는 암시적으로 곱한 maxWorkerThreads maxIoThreads 수의 곱입니다. 예를 들어 프로세서가 두 개인 경우 최대 Worker 스레드 수는 2개입니다. * maxWorkerThreads

MinFreeThreads 및 minLocalRequestFreeThreads

ASP.NET 요청 또는 로컬 요청을 시작하는 데 사용할 수 있어야 하는 작업 스레드 및 완료 포트 스레드 수를 결정하는 다음 구성 설정도 포함되어 있습니다.

<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">

사용 가능한 스레드가 충분하지 않은 경우 요청은 요청을 만들 수 있는 충분한 스레드가 확보될 때까지 대기됩니다. 따라서 ASP.NET 수보다 많은 요청이 동시에 실행되지는 않습니다.

maxWorkerThreads * (는) -minFreeThreads

참고

매개 변수와 매개 변수는 암시적으로 곱하지 minFreeThreads minLocalRequestFreeThreads 않습니다.

MinWorkerThreads

ASP.NET 원격 요청을 즉시 서비스하기 위해 사용할 수 있는 작업 스레드 수를 결정하는 다음 구성 설정도 포함되어 있습니다.

<processModel minWorkerThreads="1">

이 설정으로 제어되는 스레드는 CLR(Common Language Runtime)의 기본 스레드 조정 기능에서 만든 작업자 스레드보다 훨씬 빠른 속도로 만들 수 있습니다.

이 ASP.NET 백 엔드 서버의 속도가 느려지거나, 클라이언트 끝에서 갑작스러운 요청 버스트 또는 큐의 요청 수가 갑작스럽게 증가하여 ASP.NET 요청 큐를 갑자기 채울 수 있는 요청을 서비스할 수 있습니다.

매개 변수의 minWorkerThreads 기본값은 1입니다. 매개 변수의 값을 다음 minWorkerThreads 값으로 설정하는 것이 좋습니다.

minWorkerThreads = maxWorkerThreads / 2

기본적으로 매개 변수는Web.config파일 또는Machine.configminWorkerThreads 없습니다. 이 설정은 암시적으로 곱한 수의 곱입니다.

Maxconnection

매개 변수는 특정 IP 주소에 대해 만들 수 있는 maxconnection 연결 수를 지정합니다. 매개 변수는 다음과 같이 표시됩니다.

<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://65.53.32.230" maxconnection="12">
</connectionManagement>

응용 프로그램의 코드가 IP 주소 대신 호스트 이름을 사용하여 응용 프로그램을 참조하는 경우 매개 변수는 다음과 같이 표시해야 합니다.

<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname" maxconnection="12">
</connectionManagement>

마지막으로 응용 프로그램이 80이 아닌 포트에서 호스팅되는 경우 매개 변수는 다음과 비슷한 비표준 포트를 URL에 포함해야 합니다.

<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname:8080" maxconnection="12">
</connectionManagement>

이 문서 앞부분에서 설명한 매개 변수에 대한 설정은 모두 프로세스 수준에 있습니다. 그러나 매개 maxconnection 변수 설정은 AppDomain 수준에 적용됩니다. 기본적으로 이 설정은 AppDomain 수준에 적용되어 프로세스의 각 AppDomain에서 특정 IP 주소에 대한 최대 두 개의 연결을 만들 수 있습니다.

ExecutionTimeout

ASP.NET 다음 구성 설정을 사용하여 요청 실행 시간을 제한합니다.

<httpRuntime executionTimeout="90"/>

속성을 사용하여 이 제한을 설정할 수 Server.ScriptTimeout 있습니다.

참고

매개 변수의 값을 늘리면 매개 변수 executionTimeout 설정을 processModel responseDeadlockInterval 수정해야 할 수도 있습니다.

권장 사항

이 섹션에서 권장하는 설정이 일부 응용 프로그램에서는 작동하지 않을 수 있습니다. 그러나 다음과 같은 추가 정보는 적절한 조정을 하는 데 도움이 될 수 있습니다.

각 ASPX 페이지에서 단일 IP 주소로 웹 서비스를 호출하는 경우 다음 구성 설정을 사용하는 것이 좋습니다.

  • 매개 변수 및 매개 maxWorkerThreads 변수의 maxIoThreads 값을 100으로 설정
  • 매개 변수의 값을 maxconnection 12 * N으로 설정합니다. 여기서 N은 사용 중이 아닌 12개까지의 값입니다.
  • 매개 변수의 값을 minFreeThreads 88 * N으로 설정하고 매개 변수를 minLocalRequestFreeThreads 76 * N로 설정합니다.
  • 값을 minWorkerThreads 50으로 설정 구성 minWorkerThreads 파일에는 기본적으로 없습니다. 추가해야 합니다.

이러한 권장 사항 중 일부는 서버의 COP 수를 수반하는 간단한 수식입니다. 수식의 COP 수를 나타내는 변수는 N입니다.

이러한 설정의 경우 하이퍼스레드를 사용하도록 설정한 경우 실제 CUS 수 대신 논리적 CPUS 수를 사용해야 합니다. 예를 들어 하이퍼스레드를 사용하는 4 프로세서 서버가 있는 경우 수식의 N 값은 4가 아닌 8이 됩니다.

참고

이 구성을 사용하는 경우 100-88=12이기 때문에 CPU당 최대 ASP.NET 요청을 동시에 실행할 수 있습니다. 따라서 웹 서비스 콜백 등의 다른 용도에 대해 88개 * 이상의 N 작업 스레드와 88 * N 완료 포트 스레드를 사용할 수 있습니다.

예를 들어 4개의 프로세서와 하이퍼스레드를 사용하는 서버가 있습니다. 이러한 수식에 따라 이 문서에 설명된 구성 설정에 대해 다음 값을 사용합니다.

<system.web>
    <processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
    <httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
    <connectionManagement>
        <add address="[ProvideIPHere]" maxconnection="96"/>
    </connectionManagement>
</system.net>

또한 이 구성을 사용하는 경우 각 AppDomain의 IP 주소당 CPU당 12개 연결을 사용할 수 있습니다. 따라서 다음 시나리오에서는 요청이 연결을 기다리는 경우 거의 다를 수 있으며 는 ThreadPool 소진되지 않습니다.

  • 웹은 하나의 응용 프로그램(AppDomain)만 호스팅합니다.
  • ASPX 페이지에 대한 각 요청은 웹 서비스 요청을 하나씩 요청합니다.
  • 모든 요청은 동일한 IP 주소에 대한 것입니다.

그러나 이 구성을 사용하는 경우 아래 중 하나와 관련된 시나리오에서 너무 많은 연결을 사용할 수 있습니다.

  • 여러 IP 주소에 대한 요청입니다.
  • 요청이 리디렉션됩니다(상태 코드 302).
  • 요청에는 인증이 필요 합니다.
  • 여러 AppDomain에서 요청됩니다.

이러한 시나리오에서는 매개 변수의 값이 낮고 매개 변수 및 매개 변수에 대해 더 높은 값을 maxconnection minFreeThreads 사용하는 것이 minLocalRequestFreeThreads 좋습니다.

추가 정보

자세한 내용은 성능 향상을 ASP.NET 참조하세요.

IIS에서 성능 및 경이가 저조한 경우 ASP.NET Microsoft 블로그로 이동하세요.