클라이언트의 동시 연결 수(maxconnection)

Posted in .NET Framework // Posted at 2013. 11. 6. 16:41
728x90

응용프로그램의 성능 저하 문제는 사소하게 간과한, 몇 가지 이유로 유발되는 경우도 있다.

여기서 언급하고자 하는 것도 그러한 것 중 하나이다.

 

바로 클라이언트의 동시 연결 수 제한에 따른 성능 저하 현상이다. 닷넷 응용프로그램에서 원격 호스트와 통신할 때 적용되는 동시 연결 수의 제한인데, 특별히 값을 지정하지 않는 경우(기본 값) 2개의 연결만 허용하게 된다.

 

보편적인 (단순한) 환경이라면 이 제한 값은 문제 되지 않을 것이다. 하지만 매우 바쁜 호스트가 멀티 쓰레드 환경에서 원격시 서버와 통신을 빈번히 하는 경우라면 예기가 달라진다.

 

특히 두 호스트가 Server to Server 방식이라면 이 제한 값은 문제될 소지가 높아진다. 

 

예를 들어, A 서버가 클라이언트의 요청을 받아서 작업을 수행하는데 이 작업 중에서 원격지 서버와 통신하는 부분이 있다고 가정해보자. 이때 A 서버는 그 자체가 서버 응용프로그램이기 때문에 멀티 쓰레드 환경에서 요청을 처리하게 되는 경우(이 말은 꼭 개발자가 직접 작성한 멀티 쓰레드 프로그램만을 말하는 것은 아니다. 프로그램이 얹혀지는 호스팅 환경 자체에서 풀을 기반으로 동시 처리를 하게 되는 경우도 포함한다. 이러한 사례는 웹 응용프로그램이 대표적이다.)가 많으며 요청이 과도하게 몰릴 경우 원격 서버와 통신이 그 만큼 빈번하게 이뤄지게 된다. 이런 환경에서 최대 동시 연결 수가 2개 밖에 되지 않는다면 병목 현상으로 이어질 확률이 높다. 특히 원격지 서버의 작업 수행 시간이 길어진다면 연결을 위한 대기 시간은 점점 늘어나게 될 것이다.

 

더욱 문제는 이 값의 설정이 기본적으로 노출되어 있지 않다는 데 있다. 닷넷 응용프로그램의 config 파일에는 몇 가지 기본 설정들이 자동으로 포함되는데 이 설정 값은 그렇지 않아, 기본 값인 2가 사용되도록 되어 있다.

 

이러한 이유로 많은 개발자들이 이 값의 설정을 간과하게 되며, 심지어 이러한 설정이 있는지 모르는 경우도 많다. 복잡한 환경에서 서버의 응답 속도가 느려 진다는 것은 참으로 많은 구간을 확인해야 하는 일이다. 네트워크, 시스템, DB, 응용프로그램 등 다양한 구간에 가능성을 두고 분할 정복해야 한다.

 

특히 Server to Server 통신 환경에서, 원격 서버의 응답 지연 현상이 반드시 원격 서버만의 문제가 아닐 수 있다는 가능성도 열어 두길 바란다. 앞서 시나리오라면 클라이언트의 설정 값의 변경만으로도 성능 개선이 많이 이뤄질 수도 있다. (물론 원격 서버의 응답시간 자체는 허용 범위 내에 있다는 가정을 둔다.)

 

이런 시나리오를 간단히 테스트 해 보자. 

 

* 원격 서버: ASP.NET MVC Web API 로 기본 Getter 구현. 의도적으로 응답을 지연 시킨다.

 

* 클라이언트: 콘솔 어플리케이션으로 멀티 쓰레드로 원격 서버의 Getter 호출(대략 다음의 코드)

   for (int i = 0; i < 20; i++)
   {
           Thread thread = new Thread(new ThreadStart(Start));
            thread.Start();  //원격 서버 호출하는 스레드 시작
    }

 

 

1. 기본 값을 사용한 경우

특별히 maxconnection 설정을 추가하지 않은 경우, netstat 나 TCPView 프로그램으로 연결 수를 확인해 보면 20개의 요청이 동시에 이뤄지지만, 연결 수는 단 2개만 존재하는 것을 확인할 수 있다.

 

 

 

2. maxconnection을 20으로 설정한 경우

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

 

클라이언트 프로그램의 설정 파일에 위와 같이 maxconnection을 설정하고 다시 확인해 보면 20개의 요청만큼 동시 연결이 되어 있는 것을 확인할 수 있다.

 

 

앞서 2개의 연결만으로 20개의 원격 호출을 처리하는 것보다, 20개의 연결으로 20개의 원격 호출을 병렬적으로 처리하는 것이 훨씬 응답성을 높일 것이다.

 

참고로 이 값의 정해진 규칙은 없다. 응용프로그램의 시스템 환경과 사용량을 파악해 적절한 값을 지정해야 할 것이다. 다만 Server to Server 방식에서 멀티 쓰레드로 원격 통신이 빈번한 환경이라면 기본 값인 '2'는 너무 작은 값임에는 분명하다 하겠다. 

 

 

'.NET Framework' 카테고리의 다른 글

SQL Double Split  (0) 2013.11.13
Optimizing IIS Performance  (2) 2013.11.07
비동기 프로그래밍에서의 메모리 누수  (0) 2013.11.06
OAuth 2.0 Flow  (0) 2013.09.05
Custom Configuration  (6) 2013.08.26