dev.Log

epoll 보다 좋은 io_uring 본문

BACKEND.*/Server

epoll 보다 좋은 io_uring

초코푸딩 2025. 2. 1. 00:30

아직은 Rocky Linux 8.X버전으로 나가는게 많아서 바꾸긴 좀 그렇지만

8 완전 지원 종료(2029.05.31) 이후엔 io_uring으로 변경하면 좋지 않을까.... 

📌 1. epoll과 io_uring의 핵심 차이

  epoll io_uring
지원 I/O 타입 주로 네트워크 I/O (소켓, TCP/IP 등) 파일 I/O + 네트워크 I/O 모두 지원
비동기 지원 방식 이벤트 기반 감시 (poll()보다 개선) 완전한 비동기 (Zero-copy, syscalls 최소화)
시스템 콜 호출 수 이벤트 감시용 epoll_wait() 필요 SQE 큐를 통해 syscall 호출 최소화
성능 (I/O 요청 수 많을 때) 높은 부하에서 성능 저하 발생 대량 I/O 처리 시 epoll보다 빠름
멀티스레드 최적화 일부 한계 있음 완전한 멀티스레드 최적화
사용 가능한 커널 버전 Linux 2.6 이상 Linux 5.1 이상

 

📌 2. 성능 비교 (벤치마크 데이터)

일반적으로, 대량의 I/O 요청을 처리하는 경우 io_uring이 훨씬 더 빠릅니다.
여러 벤치마크 결과를 기반으로 대략적인 성능 차이를 정리하면 다음과 같습니다.

테스트 환경epoll (TPS, 초당 처리량)io_uring (TPS, 초당 처리량)성능 향상율

단일 소켓, 1KiB 패킷 약 1M TPS 약 2.2M TPS 220% 증가
100개 소켓, 1KiB 패킷 약 500K TPS 약 1.7M TPS 340% 증가
파일 읽기 (pread()) 약 50K TPS 약 150K TPS 300% 증가

📌 벤치마크 결과 요약:

  • 네트워크 I/O에서는 약 2~3배 속도 차이
  • 파일 I/O에서는 약 3배 차이
  • epoll은 시스템 콜(epoll_wait())을 계속 호출해야 하지만, io_uring은 한 번의 syscall로 여러 개의 요청을 처리할 수 있음 → 성능 향상

📌 3. epoll과 io_uring의 작동 방식 비교

1️⃣ epoll의 동작 방식 (기본적으로 이벤트 감시)

  • epoll_create(), epoll_ctl()로 감시할 파일 디스크립터(FD) 등록
  • epoll_wait()로 이벤트 감시 (데이터 도착 시 알림)
  • I/O가 준비되면 read()/write() 호출

🔹 단점:

  • epoll_wait() 호출 후에도 read()/write()는 여전히 syscall을 필요로 함.
  • 완전한 비동기가 아니라 "이벤트 감시 기반" 비동기임.
  • 네트워크 I/O에서는 적절하지만, 파일 I/O에는 적용이 어려움.

2️⃣ io_uring의 동작 방식 (완전한 비동기)

  • io_uring_queue_init()으로 큐 생성 (Submission Queue, Completion Queue)
  • I/O 요청을 SQE(Submission Queue Entry)에 추가
  • io_uring_submit()으로 커널에 전달 → syscall 호출 없음
  • I/O 작업 완료 시 CQE(Completion Queue Entry)에서 결과 확인

🔹 장점:

  • io_uring은 I/O 요청을 한 번에 큐에 넣고, syscall 없이 실행 가능.
  • syscall 호출을 줄여 CPU 부하 감소 → I/O 요청이 많을수록 성능 향상됨.
  • 파일 I/O, 네트워크 I/O, 이벤트 기반 I/O 모두 지원.

📌 4. 언제 epoll을 사용하고 언제 io_uring을 사용해야 할까?

epoll을 써야 하는 경우

  • 기존의 네트워크 서버 (예: Nginx, Redis, Kafka 등)와 호환성을 유지해야 할 때.
  • 커널 버전이 낮아 io_uring을 사용할 수 없을 때 (Linux 5.1 미만).
  • 단순한 이벤트 기반 네트워크 I/O를 처리할 때.

io_uring을 써야 하는 경우

  • 대량의 비동기 파일 I/O 및 네트워크 I/O가 필요한 경우 (예: 대량 로그 처리, DB 시스템).
  • syscall 오버헤드를 줄여야 할 때 (예: 초고성능 서버, 데이터베이스, 스토리지 시스템).
  • 최신 Linux 환경을 사용할 수 있을 때 (Linux 5.1 이상 필요)

'BACKEND.* > Server' 카테고리의 다른 글

네트워크매니저 고장 삐용삐용  (0) 2025.02.15
두 가지 솔루션을 도커로 패키징하기  (0) 2025.02.15
멀티마스터에서 키충돌 피하는 법  (0) 2024.12.28
backpressure vs RingBuffer  (0) 2024.12.26
JIT 컴파일러  (0) 2024.12.22
Comments