내 ASP.NET 응용 프로그램이 웹 서비스에 만들 수있는 동시 연결 수를 제한하는 것은 무엇입니까?


90

RAM, CPU, 디스크 등이 많은 64 비트 Windows Server 2008 R2 Enterprise 컴퓨터에서 IIS 7.5에서 실행되는 ASP.NET 4.0 응용 프로그램이 있습니다.

웹 요청이있을 때마다 ASP.NET 응용 프로그램은 동일한 컴퓨터에서 실행되는 백엔드 웹 서비스 (원시 소켓을 통해)에 연결합니다.

문제 : 백엔드 웹 서비스에 대한 동시 연결 수를 제한하는 것이있는 것 같습니다 . 의심스럽게도 동시 연결 수가 16 개를 넘어 섰습니다.

웹 서비스 요청을 많이하는 ASP.NET 앱을 수용하기 위해 IIS 설정을 조정하는 방법을 설명하는 Microsoft의 주요 기사를 찾았습니다. http://support.microsoft.com/?id=821268#tocHeadRef

나는 기사의 추천을 따랐지만 여전히 운이 없다. 특히 흥미로운 설정은 설정입니다 maxconnection. 심지어 999까지 올렸습니다.

연결을 제한 할 수있는 다른 아이디어가 있습니까?

참고 : IIS를 혼합에서 제외하고 클라이언트가 백엔드 웹 서비스에 직접 연결하도록하면 필요한만큼의 연결이 행복하게 열리므로 백엔드가 병목 현상이 아니라고 확신합니다. IIS / ASP.NET-land에 있어야합니다.

다음 machine.config은 응용 프로그램에서 읽고 있다고 확신하는 의 관련 섹션입니다 (으로 확인 appcmd.exe).

<system.web>
    <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
    <httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>

    <httpHandlers />

    <membership>
        <providers>
            <add name="AspNetSqlMembershipProvider"
                type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                connectionStringName="LocalSqlServer"
                enablePasswordRetrieval="false"
                enablePasswordReset="true"
                requiresQuestionAndAnswer="true"
                applicationName="/"
                requiresUniqueEmail="false"
                passwordFormat="Hashed"
                maxInvalidPasswordAttempts="5"
                minRequiredPasswordLength="7"
                minRequiredNonalphanumericCharacters="1"
                passwordAttemptWindow="10"
                passwordStrengthRegularExpression="" />
        </providers>
    </membership>

    <profile>
        <providers>
            <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </profile>

    <roleManager>
        <providers>
            <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <add name="AspNetWindowsTokenRoleProvider" applicationName="/"
                type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </roleManager>
</system.web>
<system.net>
    <connectionManagement>
        <add address="*" maxconnection="999"/>
    </connectionManagement>
</system.net>

@DanB는 여기서 좋은 점을 가지고 있습니다. 동시 연결 수를 어떻게 측정하고 있습니까?
Jeremy McGee

@JeremyMcGee IIS 작업자 프로세스가 만든 백엔드 연결 수를 확인하기 위해 서버에서 TCPView를 실행하여 동시 연결 수를 측정하고 있습니다.
Rob Sobers

웹 클라이언트가 독립적 인 시스템에서 실행되고 있습니까? 아니면 동일한 시스템에서 실행되고 있습니까? (계속 더 클라이언트 측의 제한이 없다는 것을 확인.)
제레미 맥기

3
@JeremyMcGee 별도의 기계. 머신 당 1 개의 클라이언트-서버 연결. 또한 백엔드에 직접 도달 할 때 (HTTP에서도 발생) 병목 현상이 발생하지 않기 때문에 네트워크 어딘가에 스로틀 링이 없다는 것을 알고 있습니다.
Rob Sobers

1
Rob, 이것에 대한 확실한 해결책을 찾은 적이 있습니까?
electronicKT

답변:


104

여기에 제공된 대부분의 답변은 ASP.net 애플리케이션에서 백엔드 서비스로 보낼 수있는 나가는 요청 수가 아니라 백엔드 웹 서비스 로 들어오는 요청 수를 나타 냅니다.

여기서 요청 속도를 조절하는 것은 백엔드 웹 서비스가 아니라 호출 애플리케이션이 동일한 엔드 포인트 (동일한 URL)에 대해 설정하려는 열린 연결의 수입니다.

machine.config 파일에 다음 구성 섹션을 추가하여이 제한을 제거 할 수 있습니다.

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="65535"/>
    </connectionManagement>
  </system.net>
</configuration>

물론 50 개 또는 100 개의 동시 연결을 원할 경우 더 합리적인 수를 선택할 수 있습니다. 그러나 위의 내용은 최대로 열릴 것입니다. 모든 주소를 나타내는 '*'대신 위의 공개 제한 규칙에 대한 특정 주소를 지정할 수도 있습니다.

System.Net.connectionManagement에 대한 MSDN 설명서

.NET의 ConnectManagement를 이해하기위한 또 다른 훌륭한 리소스

이것이 문제를 해결하기를 바랍니다!

편집 : 죄송합니다, 위의 코드에 언급 된 연결 관리가 있습니다. 위의 정보는 동일한 문제가있는 미래의 질문자와 관련이 있으므로 남겨 두겠습니다. 그러나 현재 대부분의 최신 서버에는 4 개의 다른 machine.config 파일이 있습니다.

32 비트와 64 비트 모두에서 실행되는 .NET Framework v2와 32 비트와 64 비트 모두에서 실행되는 .NET Framework v4가 있습니다. 응용 프로그램 풀에 대해 선택한 설정에 따라이 4 가지 machine.config 파일 중 하나를 사용할 수 있습니다! 일반적으로 여기에있는 4 개의 machine.config 파일을 모두 확인하십시오.

  • C : \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
  • 기음 : \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG
  • C : \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config
  • C : \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config

네, 그 기지를 덮었습니다. 어쨌든 감사합니다, @BenSwayne! 올바른 machine.config(64 비트 4.0)을 수정했는지 확인했습니다 .
Rob Sobers

@RobSobers :이 경우 구현 코드가 조금 의심 스러울 것입니다. 아마도 당신은 스레드 또는 무언가가 부족합니까? TcpClient 웹 서비스 호출 코드를 콘솔 앱에 넣고 더 나은 요청 속도를 얻을 수 있는지 확인할 수 있습니까? 이것은 IIS 특정 구성인지 또는 광범위한 .NET 구성인지 또는 코드인지를 증명합니다.
BenSwayne 2010 년

이 줄이 클라이언트 컴퓨터에 있습니까?
Uri Abramson

감사합니다. 설정은 codeproject.com/Articles/133738/…의 processModel 조정과 결합됩니다. 수정 된 "ISAPI 'C : \ windows \ Microsoft.Net \ Framework \ v2.0.050727 \ aspnet_isapi.dll'은 다음과 같은 이유로 자신을 비정상으로보고했습니다. : '교착 상태 감지'문제
Zakos

@BenSwayne은 SMTP 연결에도 동일한 개념을 적용합니까? 대량 전자 메일 보내기 응용 프로그램을 설계 중이므로이 ConnectionManagement 속성이 대량 메일을 보내는 데에도 유용 합니까 ( mail.send 함수에 다중 스레딩 사용 )?
vibs2006 dec.

7

질문이 다소 오래되었을 수 있지만 백엔드가 동일한 서버에서 실행되고 있다고 말합니다. 이는 아마도 기본 포트 80이 아닌 다른 포트에 있음을 의미합니다.

"connectionManagement"구성 요소를 사용할 때 기본값 인 80과 다른 경우 포트 번호를 지정해야한다는 것을 읽었습니다.

LINK : ASP.NET에서 autoConfig = false 인 경우에도 maxConnection 설정이 작동하지 않을 수 있습니다.

둘째, 고유 한 백엔드 특정 값으로 확장 된 기본 구성 (address = "*")을 사용하기로 선택한 경우 특정 값을 먼저 넣는 것을 고려할 수 있습니다! 그렇지 않고 요청이 이루어지면 *가 먼저 일치하고 기본값 인 2 개의 연결이 사용됩니다. web.config의 섹션을 사용할 때와 같습니다.

LINK : <remove> connectionManagement 요소 (네트워크 설정)

누군가에게 도움이되기를 바랍니다.


5

WCF 기반 웹 서비스 참조를 사용하고있을 수 있습니까? 기본적으로 ServiceThrottlingBehavior.MaxConcurrentCalls 는 16입니다.

서비스 참조 동작의 <serviceThrottling>요소를 업데이트 할 수 있습니다.

<serviceThrottling
    maxConcurrentCalls="999" 
    maxConcurrentSessions="999" 
    maxConcurrentInstances="999" />

(위의 설정을 권장합니다.) 적절한 요소 를 구성하는 방법에 대한 자세한 내용 은 MSDN 을 참조하십시오 <behavior>.


나는 우리가 그랬 으면 좋겠지 만 그렇지 않다. 소비되는 서비스는 다른 컴퓨터의 Apache / Python / mod_wsgi에서 실행 중이며 Rob이 언급했듯이 분명히 문제가 아닙니다.
Benjamin Pollack 2011 년

서비스 참조는 클라이언트에 있습니다. 클라이언트가 Apache 서비스를 어떻게 사용하고 있습니까?
John Saunders

John이 말했듯이 제한은 웹 서비스를 사용하는 클라이언트에 설정됩니다. 아마도 "귀하의 서비스 행동"이라는 문구는 약간 오해의 소지가 있습니다. "귀하의 서비스 참조 동작"이라고 표현할 때 더 의미가 있습니까?
Ruben 2011 년

@john TcpClient(서비스는 WCF / SOAP 또는 이와 유사한 것이 아닌 사용자 지정 이진 Blob을 제공함)을 통해 사용 됩니다. 이러한 구성 옵션 당신이 사용하는 경우 순전히 당신에 영향을 미치는 될 ServiceHost하지 TcpClient; 내가 뭔가를 놓치고 있습니까?
Benjamin Pollack

"서비스 참조 추가"를 사용하지 않는 이유는 무엇입니까?
John Saunders

3

프로그래밍 방식으로 정적 DefaultConnectionLimit 속성 값을 설정하려고 했습니까 ?

여기에 그 진정한 골칫거리에 대한 좋은 정보가 있습니다 . IIS 7.5, IIS 7.0 및 IIS 6.0의 ASP.NET 스레드 사용 , 프레임 워크 4.0 업데이트 포함.


나는 이것이 중요하지 않을 것이라고 생각하지만 어쨌든 그것을 시도 할 것입니다.
Rob Sobers

이것은 우리가 몇 년 전에 그것을 고친 방법입니다. 우리는 동시성 문제가 있었고 이것은 그것을 해결하는 것처럼 보였습니다. Net.ServicePointManager.DefaultConnectionLimit = 1000은 우리가 사용한 것입니다. 연결 클래스를 만들기 전에 설정해야합니다.
Brain2000 2017-07-06

2

이 페이지의 "스레딩"섹션을 참조하십시오. http://msdn.microsoft.com/en-us/library/ff647786.aspx , "연결"섹션과 함께.

processModel 설정의 maxconnection 속성을 업그레이드 해 보셨습니까?


네, 있어요. 그러나 당신이 인용 한 그 기사는 언급 maxconnection하지 않은 주제에 대한 다른 기사들 중 흥미로운 것을 지적합니다. 속성은 로컬 웹 서비스 호출에 적용되지 않는다는 것 입니다. 이 특정 경우에 웹 서비스 로컬이지만 서비스 로컬이 아닌 다른 환경에서도 동일한 문제가 있습니다.
Rob Sobers 2011 년

@RobSobers-위의 링크는 두 번째 볼 가치가 있다고 생각합니다. 다음 부분을 확인하십시오 minLocalRequestFreeThreads.- 이 작업자 프로세스는 스레드 풀에서 사용 가능한 스레드 수가이 수 미만이면 이 설정을 사용하여 localhost (웹 응용 프로그램 이 동일한 서버에서 웹 서비스를 호출 함)의 요청을 큐에 넣습니다 . 이 설정은 minFreeThreads와 유사하지만 localhost를 사용하는 요청 에만 적용됩니다 .
Ahmad

@Ahmad 그래, 내가 설정 minLocalRequestFreeThreads내 참조 (뿐만 아니라 machine.config질문에.
롭 Sobers에게

0

웹 서비스 소모품을 호스팅하는 웹 서비스 또는 응용 프로그램 또는 서버 (apache 또는 IIS)에 정의되어 있지 않으면 실패 할 때까지 무한 연결을 만들 수 있습니다.


0

성능 테스트를 수행하는 동안 내가 수행하는 측정은 RPS입니다. 즉, 서버가 허용 가능한 대기 시간 내에서 처리 할 수있는 초당 요청 수입니다.

이론적으로 하나의 서버는 코어 수만큼의 요청을 동시에 실행할 수 있습니다.

문제가 ASP.net의 스레딩 모델 인 것처럼 보이지는 않습니다. 잠재적으로 수천 rps를 지원할 수 있기 때문입니다. 응용 프로그램에 문제가있는 것 같습니다. 동기화 기본 요소를 사용하고 있습니까?

또한 웹 서비스의 대기 시간은 얼마입니까? 응답 속도가 매우 빠릅니까 (마이크로 초 이내), 그렇지 않은 경우 비동기 호출을 고려할 수 있으므로 결국 차단하지 않습니다.

이것이 아무 소리도 내지 않으면 Visual Studio 또는 Redgate 프로파일 러를 사용하여 코드를 프로파일 링 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.