C10k 문제란?

 

C10k 문제(Connection 10,000 Problem)는 단일 서버가 동시에 10,000개 이상의 클라이언트 연결을 효율적으로 처리하는 데 발생하는 문제를 의미합니다.

이는 서버의 동시성 처리 한계와 관련된 문제로, 특히 네트워크 소켓의 I/O 성능 및 리소스 관리에서 발생합니다.


✅ C10k 문제의 배경

 

과거(19902000년대 초반)에는 웹 서버나 애플리케이션 서버가 수백수천 개의 동시 연결을 처리하는 것이 일반적이었습니다.

하지만 인터넷이 보급되고 트래픽 증가, 실시간 서비스 확대 등으로 인해 10,000개 이상의 동시 연결을 처리해야 하는 상황이 생기면서 기존 서버 아키텍처의 한계가 드러났습니다.


🔥 C10k 문제의 원인

 

1. 스레드 기반 모델(Thread-based Model)의 한계

전통적인 웹 서버(Apache, Tomcat 등)는 요청당 하나의 스레드를 생성하는 방식을 사용.

스레드 수가 많아질수록 CPU 컨텍스트 스위칭 비용 증가 → 성능 저하 발생.

2. 블로킹 I/O 모델 (Blocking I/O)

기존 서버는 클라이언트의 요청을 처리할 때 동기적(Blocking) 방식으로 작동.

즉, 하나의 요청이 끝나야 다음 요청을 처리할 수 있어 처리 속도가 느려짐.

3. 소켓 연결 제한

운영체제(OS)마다 동시에 열 수 있는 파일(소켓 포함) 개수 제한이 존재 (ulimit -n 확인 가능).

기본적으로 1024~4096개로 설정되어 있어, 10,000개 이상의 연결을 유지하려면 커널 튜닝 필요.

4. 메모리 및 CPU 리소스 부족

다량의 연결을 처리하려면 메모리(RAM), CPU 사용량 증가.

많은 연결이 발생하면 TCP/IP 스택에서 소켓을 유지하는 비용이 커짐.


🛠 C10k 문제 해결 방법

 

✅ 1. 논블로킹 I/O 모델(Non-blocking I/O) 도입

기존 Blocking I/O 대신 비동기(Asynchronous) 및 논블로킹(Non-blocking) I/O 사용.

예시: epoll(Linux), kqueue(BSD/macOS), IOCP(Windows)

 

✅ 2. 이벤트 기반 아키텍처(Event-driven Architecture)

멀티스레드(Thread-based) → 싱글스레드 이벤트 루프(Event Loop) 방식으로 변경.

대표적인 프레임워크:

Nginx (이벤트 기반 웹 서버)

Node.js (비동기 이벤트 기반 JavaScript 엔진)

libevent, libuv (C 기반 이벤트 라이브러리)

 

✅ 3. 커널 튜닝 (OS-level Tuning)

파일 디스크립터 개수 늘리기 (ulimit -n 100000)

TCP 커널 파라미터 최적화 (sysctl -w net.core.somaxconn=65535)

TIME_WAIT 소켓 재사용 (sysctl -w net.ipv4.tcp_tw_reuse=1)

 

✅ 4. 웹서버 및 애플리케이션 최적화

아파치(Apache) → Nginx(비동기 이벤트 기반)로 교체

데이터베이스 쿼리 최적화 및 캐싱(Redis, Memcached 활용)

부하 분산(Load Balancing) 적용


🚀 C10k 문제 해결 이후: C10M, C100M 시대

 

현재는 10,000개가 아닌 100만 개 이상의 동시 연결(C10M 문제, C100M 문제)을 처리해야 하는 시대가 되었습니다.

C10M 문제 해결 기술

eBPF/XDP: 네트워크 패킷을 커널에서 바로 처리하여 성능 향상

QUIC/HTTP3: TCP보다 효율적인 연결 유지

DPDK: 고성능 네트워크 프로세싱


🔹 결론

 

C10k 문제는 기존의 블로킹 I/O와 멀티스레드 방식의 한계를 극복하고, 비동기 이벤트 기반 아키텍처, OS 튜닝, 부하 분산 기법을 활용하여 해결할 수 있습니다.

오늘날에는 C10M, C100M 문제로 발전하여 더 많은 연결을 효율적으로 처리하는 기술이 개발되고 있습니다. 🚀