다시읽기: C10K 문제

비동기 소켓 통신에 대해서 간략히 글을 써볼까 하고 — 차이점이라거나, 어떻게 생각해야하는가 라거나 — 예전에 읽었던 글들을 읽는데, 내가 이쪽의 프로그래밍을 시작하게 했던 글[1] 을 다시 읽게 되었다.

The C10K problem 이란 페이지인데, 기본적인 시스템/네트웍 프로그래밍을 해봤다고 가정하고 대규모 I/O를 처리할만한 방법 5가지에 대해서 논하고 있다 — 일종의 survery paper 비슷한 느낌으로 읽히는 글이기도 하다. C10K란 말 자체가 client 10k(=1만)개를 처리하려면 어떤 방법을 써야하는지에 관해 서술한다. 가장 먼저 10k 개의 연결에 쓸 수 있는 자원을 간략히 설명하고 현존하는 I/O 전략들에 관해 설명해준다.

즉, 다음의 5가지를 주요 OS 별로 사용할 수 있는 시스템 콜들과 제안된 사항, 라이브러리들을 기반으로 풀어놓고 있다.

  1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification — select, poll, kqueue(2도 됨) 같은 시스템 콜을 쓰는 것
  2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification – 글에서도 설명하는 것 처럼 edge-triggered logic이고(1과 상반되게), epoll, kqueue, linux 2.6 kernel의 NAIO …
  3. Serve many clients with each server thread, and use asynchronous I/O — AIO함수들
  4. Serve one client with each server thread, and use blocking I/O
  5. Build the server code into the kernel

내가 저 글을 읽기 전까지 해본 게 1과 4 였는데, 2, 3 에 관해 흥미를 얻게 되었고,[2] 지금 서버 프로그래밍을 하고 있는 것 같다. 이 글 다시 한 번 읽고나서 간단한 예제를 하나 짜봐야겠다.

비동기 네트웍 I/O에 흥미가 있다면 약간 시간이 지난 글이긴 하지만 (어느정도 업데이트 되긴했지만) 이런게 있다는걸 최소한 알고 시작하는 의미로라도 괜찮은 것 같다.

  1. 2002년 가을의 일인 것 같은데 아마도 디비 수업 프로젝트를 하고 있을 때 였던 것 같다. []
  2. 5는 아직 시도도 못해봤다 []

Published by

rein

나는 ...

Leave a Reply