피드로 돌아가기
Linux의 epoll과 io_uring 비교
GeekNewsGeekNews
Infrastructure

Linux의 epoll과 io_uring 비교

io_uring 도입을 통한 Syscall 오버헤드 제거 및 RPS 20% 향상

neo2026년 6월 22일12advanced

Context

기존 epoll 기반 모델은 I/O 가능 시점만 통지하는 Readiness 모델로, 실제 데이터 처리 시 read/write Syscall을 반복 호출하는 구조적 한계를 가짐. 연결 수 증가에 따른 컨텍스트 스위칭 비용 상승으로 인해 고성능 리버스 프록시 구현에서 성능 병목 지점으로 작용함.

Technical Solution

  • Completion 모델 기반의 io_uring 도입을 통한 I/O 완료 시점 중심의 처리 구조 설계
  • Application과 Kernel 간 공유 메모리 링 버퍼(Submission/Completion Queue) 활용으로 데이터 교환 효율 극대화
  • io_uring_enter() 단일 호출을 통한 다수 작업의 배치 제출 및 회수로 Syscall 횟수 획기적 감소
  • IORING_SETUP_SQPOLL 옵션 적용으로 커널 스레드가 큐를 직접 폴링하게 하여 Syscall을 거의 완전히 제거하는 구조 채택
  • io_uring_register_buffers()를 통한 버퍼 사전 등록으로 커널의 메모리 재매핑 오버헤드를 제거한 Zero-copy I/O 구현
  • IORING_OP_SEND_ZC(Kernel 6.0+) 활용으로 네트워크 전송 시 버퍼 복사 단계 생략

1. Linux Kernel v

5.1+ 환경인지 확인 후 io_uring 도입 검토

2. Syscall 제거를 위해 IORING_SETUP_SQPOLL 사용 시 CPU 사용량 증가분 측정 및 트레이드오프 분석

3. Zero-copy 구현을 위해 io_uring_register_buffers() 적용 여부 확인

4. 비동기 에러 처리 시 반환값이 아닌 CQE의 res 필드 검증 로직 구현

5. 보안 정책에 따른 io_uring 활성화 여부 및 cBPF 지원 버전 확인

원문 읽기