프로그래밍공부(Programming Study)/CS-운영체제(OS)

현대 고성능 서버의 데이터 전송 메커니즘: epoll부터 TCP BBR까지

Chann._.y 2026. 1. 18.
728x90

 

고성능 서버의 데이터 전송 최적화 메커니즘: epoll, Zero Copy, CPU 캐시 패딩 및 TCP BBR의 통합 흐름도

대규모 트래픽을 처리하는 백엔드 시스템을 설계할 때 가장 큰 적은 '불필요한 CPU 소모'와 '기다림'입니다. 초당 수만 건 이상의 연결(C10K)을 처리하기 위해 시스템 레벨에서 어떤 최적화 기술들이 맞물려 돌아가는지, 데이터의 흐름을 따라 정리해 봅니다.


1. 연결 관리의 효율화: epoll

서버가 수만 개의 소켓(File Descriptor, FD)을 관리할 때, 가장 먼저 마주하는 병목은 "어느 소켓에 데이터가 들어왔는가?"를 확인하는 작업입니다.

  • 기존 방식(select/poll): 데이터가 왔는지 확인하기 위해 모든 FD를 순회()합니다. 연결이 늘어날수록 CPU 사용량이 선형적으로 증가합니다.
  • epoll: 운영체제 커널이 '이벤트가 발생한 FD 목록'을 별도로 관리합니다. 서버는 이 목록만 확인()하면 되므로, 연결 수에 상관없이 일정한 성능을 유지합니다.

실습: epoll 핵심 로직 (C언어)

// 1. epoll 인스턴스 생성
int epfd = epoll_create1(0);

// 2. 감시할 소켓(FD) 등록
struct epoll_event event;
event.events = EPOLLIN; // 데이터 수신 이벤트 감시
event.data.fd = server_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, server_fd, &event);

// 3. 이벤트 발생 대기 (CPU를 점유하지 않고 대기)
int n = epoll_wait(epfd, events, MAX_EVENTS, -1);

2. 메모리 복사 최소화: Zero Copy와 sendfile

데이터를 디스크에서 읽어 네트워크로 보낼 때, 전통적인 read/write 방식은 커널 영역과 유저 영역 사이에서 데이터 복사를 반복합니다. 이 과정에서 발생하는 컨텍스트 스위칭은 상당한 오버헤드입니다.

  • sendfile(): 유저 영역을 거치지 않고 커널 내부에서 '디스크 버퍼 → 소켓 버퍼'로 데이터를 직접 복사합니다.
  • Zero Copy: CPU가 개입하는 복사 단계를 원천적으로 제거하여, CPU 부하를 낮추고 처리량(Throughput)을 극대화합니다.

3. 멀티코어 환경의 캐시 최적화: False Sharing과 Padding

서버 내부에서 여러 CPU 코어가 데이터를 처리할 때, 독립된 데이터임에도 물리적인 캐시 구조 때문에 성능이 저하되는 상황이 발생합니다.

  • 거짓 공유(False Sharing): 서로 다른 코어가 사용하는 변수들이 같은 캐시 라인(보통 64바이트)에 묶여 있어, 한 쪽의 수정이 다른 쪽의 캐시를 무효화(Invalidate)시키는 현상입니다.
  • 해결책(Padding): 변수 사이에 의미 없는 데이터를 넣어 캐시 라인을 물리적으로 분리합니다.
  • Cache-to-Cache (C2C): 데이터 공유가 불가피할 경우, 메인 메모리를 거치지 않고 코어 간 빠른 인터커넥트를 통해 캐시 데이터를 직접 전달하여 지연 시간을 줄입니다.

4. 네트워크 전송 제어: TCP BBR

데이터가 서버를 떠나 네트워크 망에 진입했을 때, 마지막 병목은 '혼잡 제어(Congestion Control)'입니다.

  • 전통적 방식(CUBIC): 패킷 손실이 발생하면 무조건 네트워크 정체로 판단하고 속도를 줄입니다.
  • TCP BBR: 구글이 개발한 모델로, 패킷 손실이 아닌 '실제 대역폭'과 '왕복 시간(RTT)'을 측정하여 고속도로의 한계치까지 정속 주행합니다.

실습: 리눅스에서 BBR 활성화하기

# 1. 현재 설정 확인
sysctl net.ipv4.tcp_congestion_control

# 2. BBR 활성화 (커널 4.9 이상)
sudo sysctl -w net.core.default_qdisc=fq
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

# 3. 적용 결과 확인
sysctl net.ipv4.tcp_congestion_control
# 출력: net.ipv4.tcp_congestion_control = bbr

결론: 성능 최적화의 핵심은 '단축'

결국 고성능 시스템 설계의 핵심은 데이터가 이동하는 경로에서 불필요한 복사와 기다림을 제거하는 것입니다.

  1. epoll로 탐색 시간을 단축하고,
  2. Zero Copy로 복사 경로를 단축하며,
  3. Padding으로 캐시 동기화 지연을 단축하고,
  4. BBR로 네트워크 전송 효율을 극대화합니다.

시스템 하부 구조에 대한 깊은 이해는 더 견고하고 빠른 서비스를 만드는 밑거름이 됩니다.


🛠 부록: 시스템 성능 분석 도구 추천

  • htop: CPU 사용량 및 컨텍스트 스위칭 실시간 모니터링
  • perf: CPU 캐시 미스 및 커널 함수 호출 부하 분석
  • ss -tin: 소켓별 TCP 대역폭 및 BBR 상태 확인
  • strace: 프로세스가 호출하는 시스템 콜(read, write, sendfile) 추적
728x90

댓글