dev.Log
epoll 보다 좋은 io_uring 본문
아직은 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