IT_Programming/Network Programming

[펌] C10k Problem

JJun ™ 2016. 8. 19. 12:53



 출처

 : http://118k.tistory.com/198

 : http://openwiki.kr/tech/c10k_problem#fn__1


 참고자료http://www.kegel.com/c10k.html




C10K는 다수의 클라이언트를 동시에 처리할 수 있는가에 대한 의문이다. 

(1만개의 소켓을 열게 된다면 하드웨어가 충분한데도 불구하고 I/O 처리방식의 문제때문에 프로세스가 제대로 처리하지 못한다는 것)


소켓을 처음 설계할 당시에는 10K의 클라이언트를 처리할 하드웨어 여력이 되지 않았기 때문에 생기는 의문이었다. 


현재는 이를 해결하는 방법으로 Unix 계열에서는 select(), opll(), kqueue(), 윈도우 계열에서는 IOCP 등을 이용하여 처리한다. 


이를 해결하기 위해, NGINX, node.js 에서는 이벤트 드리븐방식의 비동기 처리를 통해 해결한다. 


 


[참고]

http://openwiki.kr/tech/c10k_problem

https://en.wikipedia.org/wiki/C10k_problem

http://egloos.zum.com/D00D00/v/94967







C10K Problem은 하나의 System에 얼마나 많은 Client가 붙을 수 있냐는 의문과 그에 대한 도전에서 제기되는 문제이다



BSD소켓을 설계할 당시에는 10K 클라이언트가 붙을 하드웨어적 환경이 안 되었다. 1)

그 때는 하드웨어가 병목이었다만 80년대 말부터 학자들은 소프트웨어 위기론을 현실로 받아들여야 한다고 주장했다.
하드웨어는 10년에 4배씩 좋아지지만, 소프트웨어는 그렇지 못한 것을 발견했다.
물론, 이 문제는 소프트웨어 공학에서 접근하는 문제 제기이다.

UNIX계열 OS의 I/O Model가 2K 이상의 소켓을 열어서 정상적인 I/O를 할 수 있냐는 문제가 제기되었다.
 2)

UNIX계열에서는 File Descriptor를 만드는데 드는 비용과 그 많은 소켓을 동기화시키는 문제가 있다.
즉, 10K만큼의 소켓을 열게 된다면 하드웨어가 충분한데도 불구하고 OS에서 제공하는 I/O 처리방식의 문제 때문에
프로세스가 제대로 처리하지 못한다는 것이 C10K Problem이다 
3)

이것이 C10K Project라고 함 해보자는 모드로 가서 Solaris에서 제안한 /dev/poll 모델을 출발로 해서
여러 가지 모델이 나오고 적용되고는 있다.

이 문제를 잘 해결해서 실제 잘 적용된 것은 MS Windows의 Overlapped I/O와 IOCP이다.

정리하자면 C10K Problem은 UNIX계열의 OS가 I/O 모델의 미비로 인해 제기된 것이다.
이는 현재 많은 해결책들이 나오고 있다


1) 만약, 웹서버가 동시에 10K 가 붙으면 일단 넷웍 대역만해도 기가비트 급이다.
   소켓의 개념이 도입된 20년 전만해도 상상도 못 할 일이고, 그외 그에 따른 리소스 관리를 감당할 하드웨어는 존재하지도 않았다.

2) 2048은 select()함수의 파라미터로 들어가는 File Descriptor 배열의 MAX값이다.

3) 10K가 한계란 뜻은 아니고 많다는 뜻.

별도로 명시하지 않을 경우, 이 위키의 내용은 다음 라이선스에 따라 사용할 수 있습니다
CC Attribution-Noncommercial-Share Alike 4.0 International