피드로 돌아가기
Dev.toDatabase
원문 읽기
I/O Multiplexing과 ae Event Loop를 통한 Single-Thread 고성능 아키텍처 구현
Redis's Event-Driven Architecture and the ae Event Loop
AI 요약
Context
전통적인 Blocking I/O 및 Thread-per-connection 모델에서 발생하는 메모리 낭비와 Context Switch 비용이 병목 지점으로 작용. 수천 개의 동시 연결 환경에서 스레드 스택 메모리 점유 및 OS 스케줄링 오버헤드로 인한 성능 저하 문제 발생.
Technical Solution
- Non-blocking I/O 설정을 통한 read() 호출 시 대기 시간 제거 및 CPU 자원 낭비 방지
- epoll(Linux) 및 kqueue(BSD) 기반의 I/O Multiplexing 도입으로 O(n) 스캔 비용을 제거하고 이벤트 발생 fd만 처리하는 구조 설계
- 자체 경량 라이브러리 ae Event Loop를 구축하여 File events(소켓 활동)와 Time events(주기적 작업)를 통합 관리
- 메모리 내 데이터 처리 특성에 맞춘 Single-Thread 실행 모델 채택으로 Synchronization 및 Cache Coherence 비용 원천 제거
- Redis 6.0 이후 소켓 읽기/쓰기 단계에 Threaded I/O를 부분 도입하여 I/O Syscall 병목 지점을 최적화
- O(n) 복잡도의 Blocking 커맨드를 SCAN 등의 Cursor-based 방식으로 대체하여 Event Loop 정지 현상 방지
실천 포인트
- 대규모 동시 연결 처리 시 Thread 수를 늘리기보다 I/O Multiplexing 도입 검토 - CPU Bound 작업이 아닌 I/O Bound 작업 위주의 워크로드에서 Single-Thread 모델의 효율성 확인 - Event Loop 기반 설계 시 O(n) 이상의 복잡도를 가진 Blocking 작업이 전체 시스템을 중단시킬 수 있음을 인지하고 분할 처리 설계 - 시스템 콜(Syscall) 비용이 임계치를 넘을 경우 I/O 단계만 멀티스레드로 분리하는 하이브리드 구조 고려