'WCF 성능 향상 팁'에 해당되는 글 1건

  1. 2009.11.20 WCF 성능 향상 팁 (2)

WCF 성능 향상 팁

.NET/WCF 2009. 11. 20. 08:30 |

WCF Performance Optimization Tips

.NET Framework 3.0 부터는 Enterprise Services 를 잘 구현할 수 있는 WCF(Windows Communication Foundation) 라이브러리를 제공합니다. 특히 최근 .NET Framework 3.5 SP1 에서는 서비스의 통합 뿐만 아니라 Enterprise Services Bus 를 구현하여 최상의 SOA(Services Oriented Architecture) 를 구현할 수 있는 프레임워크입니다.

그렇기 때문에 기존에 .NET 이 제공하던 XML Web Services 와 WCF 를 동일 선상에서 비교하거나 생각하는 것은 굉장히 위험할 수 있습니다. 가끔 BasicHttpBinding 이나 WSHttpBinding 등을 사용하여 IIS 에 호스팅 할 경우 성능에 대해 고민을 해 보신 분들도 계실 겁니다. 예전에 XML Web Service 로 잘 수행했던 프로젝트를 WCF 를 사용하여 만들었을 경우 서버가 자주 뻗는 경우도 있었을 것입니다.

   

Web Based Performance Optimization Tips

즉, 일반적으로 IIS 에 호스팅되는 Web Application 이나 XML Web Service 의 성능을 향상시키기 위해서는 Thread 나 Connection 을 늘려주는 방법으로 성능 튜닝을 할 수 있었습니다. ( default 는 .NET Framework 1.1 기준 )

  • Max Connection - default 2
  • Max IO Threads - default 20
  • Max Worker Threads - default 20
  • Min Free Threads - default 8
  • Min Local Request Free Threads - default 4

잘 모르시겠다구요~? MSDN 에 보시면 나옵니다. 각각 항목은 단지 권장 값이고 튜닝을 하기 위해서는 "추천 수치 * CPU 개수" 가 바로 최상의 성능을 낼 수 있는 Threads 나 Connection 이 됩니다. 사실 기본 값으로 서버 성능을 최상으로 발휘하기에는 무리가 있습니다.

   

WCF Based Performance Optimization Tips

하지만 WCF 에서는 이러한 성능 튜닝 방법은 전혀 다른 차원의 이야기 입니다. 왜냐하면 Web Application 이나 XML Web Service 와 달리 WCF 는 ASP.NET Pipeline(파이프라인) 을 거치지 않기 때문입니다.

Microsoft 의 WCF 개발 팀은 이런 부분에서 참 아이러니한 이야기를 합니다.

"DDos 공격을 방지하기 위함이다!" 라고...

틀린 이야기는 아니죠. ASP.NET HttpRuntime 환경을 그대로 WCF 환경으로 적용하기에는 WCF 프레임워크의 아키텍처와는 너무나 비호환적이기 때문인 것 같습니다. 다시 바꾸어 말하면, WCF 는 내부적인 ASP.NET 파이프라인을 타지 않습니다. 그렇기 때문에 기본 옵션의 Session 이나 Call 옵션으로 Service Host 가 락(Lock) 에 걸리는 상황이 옵니다.

MaxConcurrentSessions 는 Default 가 10 이므로, Closing 되지 않은 클라이언트의 세션이 이를 초과하게 되면 Lock 이 걸리게 됩니다. 아래는 간단한 예제이지만, Closing 을 잘해주더라도 Multi Thread 로 테스트를 해 보시면 금방 Lock 이 걸리게 할 수 도 있답니다.

namespace WcfService1Console

{

class Program

{

static void Main(string[] args)

{

for (int i = 0; i < 20; i++)

{

ServiceReference1.Service1Client client = new WcfService1Console.ServiceReference1.Service1Client();

Console.WriteLine(i + " " + client.GetData(3));

}

}

}

}

 

WCF 서비스는 기본값이 Max Session 이 10개에 도달하면 클라이언트의 연결을 거부합니다. Session Lock 이 걸리고 이전의 세션이 끝나야 다른 Session 의 연결을 수락하게 됩니다. WCF Session 은 HTTP Session 과 다르며, 클라이언트와 서버의 인스턴트를 연결하는 인증 매커니즘과 비슷합니다. WCF 의 SessionMode 를 NotAllowed 로 동작하도록 세션 사용을 하지 않도록 설정해도 되지만, 이러한 방법으로는 클라이언트와 서버간의 연결을 보장하지 않을 뿐이지, 실제로 세션이 연결이 되지 않는 것은 아니기 때문에, 퍼포먼스 향상을 위한 좋은 방법이라고 볼 수는 없습니다.

그리하여 WCF 의 퍼포먼스를 향상시키기 위해서는 ASP.NET 과는 별도의 Throttling 환경의 조정이 필요합니다.

<behaviors>

<serviceBehaviors>

<behavior name="WcfWsHttpSvc.Service1Behavior">

<!-- 메타데이터 정보를 공개하지 않으려면 배포하기 전에 아래의 값을 false로 설정하고 위의 메타데이터 끝점을 제거하십시오. -->

<serviceMetadata httpGetEnabled="true"/>

<serviceThrottling maxConcurrentCalls="50"

maxConcurrentSessions="50"

maxConcurrentInstances="100"/>

<!-- 디버깅 목적으로 오류에서 예외 정보를 받으려면 아래의 값을 true로 설정하십시오. 예외 정보를 공개하지 않으려면 배포하기 전에 false로 설정하십시오. -->

<serviceDebug includeExceptionDetailInFaults="false"/>

</behavior>

</serviceBehaviors>

</behaviors>

그리고 다시 테스트를 해보시면 Lock 이 걸리지 않는 것을 확인할 수 있습니다.

이 옵션은 아래와 같은 튜닝하는 것이 좋다고 가이드 합니다. 단지 권장 값이기 때문에 더 높은 값을 주어도 상관은 없습니다. 특히 MaxConcurrentInstances 는 Int32.MaxValue 값을 주셔도 됩니다. WCF 어플리케이션 서버의 배치와 Load-Balancing 을 고려하여 적절하게 주시면 됩니다.

  

기본 값

권장 값

예 (4-Core)

MaxConcurrentSessions

10

기본 값 * CPUs

40

MaxConcurrentCalls

16

기본 값 * CPUs

64

MaxConcurrentInstances

26

권장 값의 MaxConcurrentSessions + MaxConcurrentCalls

104

   

'.NET > WCF' 카테고리의 다른 글

WCF 성능 향상 팁  (2) 2009.11.20
WCF 의 불친절한 ProtocolException  (0) 2009.03.07
Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. Ryunad 2011.01.29 12:07 Address Modify/Delete Reply

    정말 좋은 것을 배워갑니다.
    감사합니다 ^^

  2. 신동열 2014.08.21 10:13 Address Modify/Delete Reply

    안그래도 이문제로 고민하고 있었는데 좋은글 보고 배워갑니다.