성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>System.Net.ServicePointManager의 DefaultConnectionLimit 속성 설명</h1> <p> <a target='tab' href='https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.defaultconnectionlimit'>DefaultConnectionLimit</a>은, app.config에서 다음의 설정으로 개발자가 명시할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <configuration> <system.net> <connectionManagement> <span style='color: blue; font-weight: bold'><add address="*" maxconnection="10"/></span> </connectionManagement> </system.net> </configuration> </pre> <br /> 만약 이것이 설정되어 있지 않으면 DefaultConnectionLimit의 값은 <a target='tab' href='https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.defaultpersistentconnectionlimit'>System.Net.ServicePointManager.PersistentConnectionLimit</a>의 값으로 초기화됩니다. PersistentConnectionLimit 속성은 다음과 같이 정의되어 있으므로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private static int PersistentConnectionLimit { get { if (ComNetOS.IsAspNetServer) { return 10; } <span style='color: blue; font-weight: bold'>return 2;</span> } } </pre> <br /> 일반적으로 2로 설정됩니다. 실제로 콘솔 응용 프로그램을 만들어 다음과 같은 코드로 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > class Program { static void Main(string[] args) { Console.WriteLine("DefaultConnectionLimit: " + System.Net.ServicePointManager.DefaultConnectionLimit); Console.WriteLine("DefaultPersistentConnectionLimit: " + System.Net.ServicePointManager.DefaultPersistentConnectionLimit); } } // 출력 결과 DefaultConnectionLimit: 2 DefaultPersistentConnectionLimit: 2 </pre> <br /> 재미있는 것은, 이 값이 ASP.NET 2.0의 경우 출력값이 다음과 같이 바뀐다는 점입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CLR: 2.0.50727.8670 DefaultConnectionLimit: 96 DefaultPersistentConnectionLimit: 2 </pre> <br /> 콜스택을 통해 .NET 2.0의 system.dll의 구현을 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System.dll!System.Net.ServicePointManager.DefaultConnectionLimit.set(int value) Line 433 C# <span style='color: blue; font-weight: bold'>System.Web.dll!System.Web.HttpRuntime.SetAutoConfigLimits(System.Web.Configuration.ProcessModelSection pmConfig)</span> Unknown System.Web.dll!System.Web.HttpRuntime.SetThreadPoolLimits() Unknown System.Web.dll!System.Web.HttpRuntime.HostingInit(System.Web.Hosting.HostingEnvironmentFlags hostingFlags) Unknown System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown [AppDomain (DefaultDomain, #1) -> AppDomain (/LM/W3SVC/3/ROOT-2-131031849823243487, #3)] System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironmentAndReportErrors(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.GetAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObjectInternal(string appId, System.Type type, System.Web.Hosting.IApplicationHost appHost, bool failIfExists, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ProcessHost.StartApplication(string appId, string appPath, out object runtimeInterface) Unknown </pre> <br /> SetAutoConfigLimits에 "CPU 수 * 12" 계산을 하는 것이 확인됩니다. (즉, 제가 실습한 컴퓨터에서 96이 나온 것은 Core 수가 8개였기 때문입니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void SetAutoConfigLimits(ProcessModelSection pmConfig) { int num; int num2; ThreadPool.GetMaxThreads(out num, out num2); if ((pmConfig.DefaultMaxWorkerThreadsForAutoConfig != num) || (pmConfig.DefaultMaxIoThreadsForAutoConfig != num2)) { System.Web.UnsafeNativeMethods.SetClrThreadPoolLimits(pmConfig.DefaultMaxWorkerThreadsForAutoConfig, pmConfig.DefaultMaxIoThreadsForAutoConfig); } <span style='color: blue; font-weight: bold'>ServicePointManager.DefaultConnectionLimit = 12 * pmConfig.CpuCount;</span> } </pre> <br /> 반면 ASP.NET 4.0의 경우 DefaultConnectionLimit의 값이 무조건 2147483647로 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CLR: 4.0.30319.42000 DefaultConnectionLimit: 2147483647 DefaultPersistentConnectionLimit: 2 </pre> <br /> 역시 콜 스택에 따라,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System.dll!System.Net.ServicePointManager.DefaultConnectionLimit.set(int value) Line 489 C# <span style='color: blue; font-weight: bold'>System.Web.dll!System.Web.HttpRuntime.SetAutoConfigLimits(System.Web.Configuration.ProcessModelSection pmConfig)</span> Unknown System.Web.dll!System.Web.HttpRuntime.SetThreadPoolLimits() Unknown System.Web.dll!System.Web.HttpRuntime.HostingInit(System.Web.Hosting.HostingEnvironmentFlags hostingFlags, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException) Unknown System.Web.dll!System.Web.HttpRuntime.InitializeHostingFeatures(System.Web.Hosting.HostingEnvironmentFlags hostingFlags, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException) Unknown System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException) Unknown System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters, System.Security.Policy.PolicyLevel policyLevel) Unknown [AppDomain (DefaultDomain, #1) -> AppDomain (/LM/W3SVC/4/ROOT-1-131031820663885227, #2)] System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironmentAndReportErrors(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.GetAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObjectInternal(string appId, System.Type type, System.Web.Hosting.IApplicationHost appHost, bool failIfExists, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown System.Web.dll!System.Web.Hosting.ProcessHost.StartApplication(string appId, string appPath, out object runtimeInterface) Unknown </pre> <br /> SetAutoConfigLimits 메서드의 구현을 보면 알 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void SetAutoConfigLimits(ProcessModelSection pmConfig) { int num; int num2; ThreadPool.GetMaxThreads(out num, out num2); if ((pmConfig.DefaultMaxWorkerThreadsForAutoConfig != num) || (pmConfig.DefaultMaxIoThreadsForAutoConfig != num2)) { System.Web.UnsafeNativeMethods.SetClrThreadPoolLimits(pmConfig.DefaultMaxWorkerThreadsForAutoConfig, pmConfig.DefaultMaxIoThreadsForAutoConfig, true); } <span style='color: blue; font-weight: bold'>ServicePointManager.DefaultConnectionLimit = 0x7fffffff;</span> } </pre> <br /> ASP.NET에서 이 값을 원치 않는다면 web.config과 machine.config을 각각 수정해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // web.config에서 system.net/connectionManagement 설정 추가 <?xml version="1.0" encoding="utf-8"?> <configuration> // ...생략... <system.net> <connectionManagement> <span style='color: blue; font-weight: bold'><add address="*" maxconnection="80"/></span> </connectionManagement> </system.net> </configuration> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // machine.config에서 processModel[@autoConfig] 속성 값을 false로 변경 <?xml version="1.0" encoding="utf-8"?> <configuration> // ...생략... <system.web> <!--processModel autoConfig="true"/--> <span style='color: blue; font-weight: bold'><processModel autoConfig="false" /></span> </system.web> </configuration> </pre> <br /> 하지만, 현실적으로 볼때 관리자 권한을 통해 machine.config을 수정하는 것이 쉽진 않습니다. 게다가 machine.config의 설정이 해당 시스템의 모든 ASP.NET 응용 프로그램에 적용된다는 점도 간과해서는 안됩니다.<br /> <br /> 따라서 이런 경우, web.config에서 원하는 URL에 대해서만 제약을 조정하는 설정을 추가하는 것이 좋습니다. 가령, 여러분의 웹 사이트에서 "<a target='tab' href='http://test.com'>http://test.com</a>"으로 접근하는 것을 알고 있다면 다음과 같이 추가해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <configuration> // ...생략... <system.net> <connectionManagement> <span style='color: blue; font-weight: bold'><add address ="http://test.com" maxconnection="100" /></span> </connectionManagement> </system.net> </configuration> </pre> <br /> 그렇다면, 만약 어떤 URL을 사용하는지 관리가 안된다면 machine.config을 수정하는 방법밖에 없을까요? 아닙니다. 다행히 ^^ ServicePointManager.DefaultConnectionLimit 속성은 set 메서드도 제공해 주기 때문에 다음과 같이 가볍게 조정해 주시면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ServicePointManager.DefaultConnectionLimit = Int32.MaxValue; </pre> <br /> ASP.NET이라면 Global.asax의 Application_Start 메서드가 저 코드를 넣기 가장 좋은 자리일 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 정리해 보면, ASP.NET 4.0인 경우 (특별히 낮춰야 할 필요가 없다면) 그냥 기본값을 쓰면 됩니다. 그 외 ASP.NET 2.0이거나 콘솔, 윈폼 등의 응용 프로그램이라면 ServicePointManager.DefaultConnectionLimit 속성에 직접 넉넉한 값을 넣어두는 것이 좋습니다.<br /> <br /> 참고로, app.config의 system.net/connectionManagement의 설정값을 코드에서 알고 싶다면 다음과 같이 .NET Reflection을 통해 알아낼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { if (asm.GetName().Name == "System") { Type type = asm.GetType("System.Configuration.PrivilegedConfigurationManager"); MethodInfo mi = type.GetMethod("GetSection", BindingFlags.Static | BindingFlags.NonPublic); object obj = mi.Invoke(null, new object [] { "system.net/connectionManagement" }); ConnectionManagementSection cms = obj as ConnectionManagementSection; if (cms.ConnectionManagement != null) { ConnectionManagementElementCollection cmc = cms.ConnectionManagement as ConnectionManagementElementCollection; foreach (ConnectionManagementElement item in cmc) { string txt = string.Format("addr = {0}, maxconnection = {1}", item.Address, item.MaxConnection); } Console.WriteLine(cmc.Count); } } } </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1918
(왼쪽의 숫자를 입력해야 합니다.)