skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

레디스는 왜 기본적으로 단일스레드로 동작하는걸까? #137

Open skarltjr opened 1 year ago

skarltjr commented 1 year ago

먼저 레디스가 빠른 이유를 알아보면

1. 인메모리 저장소로 랜덤 디스크 i/o가 아닌 메모리단에서 처리하기에 성능이 우수
- 물론 그렇기때문에 휘발성이라는 특성이 존재

2. 단일 스레드로 동작하기 때문에

왜 단일 스레드로 동작하는데 더 빠른가?

레디스의 경우 이벤트루프 방식을 활용
또한 I/O 멀티 플렉싱 방식 활용

즉 한 요청이 들어오면 해당 명령 수행 후 다음 명령 처리가 가능
그런데 I/O 멀티플렉싱의 경우 하나의 통신 채널을 통해 둘 이상의 커넥션으로부터 요청을 받아오는데
이때 get/set의 경우 초당 10만건까지 처리 가능

그러나!!!! 그렇기 때문에 시간이 오래걸리는 명령을 수행하면 망한다.
ex) O(n)의 시간복잡도 명령어
- keys
- delete collections
- get all collections
- flushAll

주의

redis의 경우 명령 실행 자체는 싱글스레드
다만 보다 나은 성능을 위해 등장한게 reading, writing, parsing 영역에서 멀티스레드로 동작하는 i/o thread 방식
- 클라이언트가 전송한 명령을 받는
- 명령어가 처리된 결과를 클라이언트에게 전달하는

정리

1. CPU는 병목현상의 원인이 아님
- 레디스의 병목현상의 대부분은 CPU가 아닌 시스템 메모리/네트워크 대역폭에서 발생
- 즉 스레드를 늘린다고 병목을 개선하는것이 아님

2. concurrency
- redis는 epoll & 이벤트 루프 방식을 채택 
- 이벤트루프 패턴을 통해 동시성을 구현하였고 Context-Switch(문맥교환)가 없어 자원을 절약