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>
답변
여기에 제공된 대부분의 답변은 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
답변
질문이 다소 오래되었을 수 있지만 백엔드가 동일한 서버에서 실행되고 있다고 말합니다. 이는 아마도 기본 포트 80이 아닌 다른 포트에 있음을 의미합니다.
“connectionManagement”구성 요소를 사용할 때 기본값 인 80과 다른 경우 포트 번호를 지정해야한다는 것을 읽었습니다.
LINK : ASP.NET에서 autoConfig = false 인 경우에도 maxConnection 설정이 작동하지 않을 수 있습니다.
둘째, 고유 한 백엔드 특정 값으로 확장 된 기본 구성 (address = “*”)을 사용하기로 선택한 경우 특정 값을 먼저 넣는 것을 고려할 수 있습니다! 그렇지 않고 요청이 이루어지면 *가 먼저 일치하고 기본값 인 2 개의 연결이 사용됩니다. web.config의 섹션을 사용할 때와 같습니다.
LINK : <remove> connectionManagement 요소 (네트워크 설정)
누군가에게 도움이되기를 바랍니다.
답변
WCF 기반 웹 서비스 참조를 사용하고있을 수 있습니까? 기본적으로 ServiceThrottlingBehavior.MaxConcurrentCalls 는 16입니다.
서비스 참조 동작의 <serviceThrottling>
요소를 업데이트 할 수 있습니다.
<serviceThrottling
maxConcurrentCalls="999"
maxConcurrentSessions="999"
maxConcurrentInstances="999" />
(위의 설정을 권장합니다.) 적절한 요소 를 구성하는 방법에 대한 자세한 내용 은 MSDN 을 참조하십시오 <behavior>
.
답변
프로그래밍 방식으로 정적 DefaultConnectionLimit 속성 값을 설정하려고 했습니까 ?
여기에 그 진정한 골칫거리에 대한 좋은 정보가 있습니다 . IIS 7.5, IIS 7.0 및 IIS 6.0의 ASP.NET 스레드 사용 , 프레임 워크 4.0 업데이트 포함.
답변
이 페이지의 “스레딩”섹션을 참조하십시오. http://msdn.microsoft.com/en-us/library/ff647786.aspx , “연결”섹션과 함께.
processModel 설정의 maxconnection 속성을 업그레이드 해 보셨습니까?
답변
웹 서비스 소모품을 호스팅하는 웹 서비스 또는 응용 프로그램 또는 서버 (apache 또는 IIS)에 정의되어 있지 않으면 실패 할 때까지 무한 연결을 만들 수 있습니다.
답변
성능 테스트를 수행하는 동안 내가 수행하는 측정은 RPS입니다. 즉, 서버가 허용 가능한 대기 시간 내에서 처리 할 수있는 초당 요청 수입니다.
이론적으로 하나의 서버는 코어 수만큼의 요청을 동시에 실행할 수 있습니다.
문제가 ASP.net의 스레딩 모델 인 것처럼 보이지는 않습니다. 잠재적으로 수천 rps를 지원할 수 있기 때문입니다. 응용 프로그램에 문제가있는 것 같습니다. 동기화 기본 요소를 사용하고 있습니까?
또한 웹 서비스의 대기 시간은 얼마입니까? 응답 속도가 매우 빠릅니까 (마이크로 초 이내), 그렇지 않은 경우 비동기 호출을 고려할 수 있으므로 결국 차단하지 않습니다.
이것이 아무 소리도 내지 않으면 Visual Studio 또는 Redgate 프로파일 러를 사용하여 코드를 프로파일 링 할 수 있습니다.