레디스(Redis) 와 싱글스레드(Single Thread)

Minsu Kang·2022년 9월 20일
1

레디스

목록 보기
2/5

일반적으로 레디스는 싱글스레드를 사용한다고 알려져 있다.
이로 인해 무거운 트랜잭션이 들어오면 다른 요청을 처리하지 못하는 현상이 발생한다.
이런 단점에도 불구하고 레디스는 어떤 이유로 싱글스레드를 사용하도록 설계 되었을까

레디스가 싱글스레드여서 가지는 장점

  • 멀티 스레드를 사용하면서 발생하는 context-swtich 비용을 줄일 수 있다.

  • 스레드 간의 자원 공유로 인한 문제에서 자유롭다.

    • 멀티스레드를 사용하면 shared data 에 대한 관리 때문에 디자인이 복잡해질 수 밖에 없다.
    • 레디스에서 shared data 에 lock 을 거는 것은 cost-effective 한 옵션이 아니다.

싱글스레드임에도 High Performance 를 내는 이유

  • 레디스는 cpu-intensive 하지 않다. 싱글스레드 만으로 초당 10만건 이상의 데이터 요청을 처리할 수 있다. (일부 명령 제외)
  • 레디스가 제공하는 클러스터 기능을 활용한다면 더 많은 요청을 처리할 수 있다.


레디스가 멀티스레드를 사용하는 Case

레디스는 특정 케이스에서 멀티 스레드(또는 프로세스) 를 사용하기도 한다.
주로 이런 케이스는 한번에 많은양의 데이터를 처리할 때 이후에 들어오는 명령어가 블락되는 것을 막기 위함이다.

  • 레디스는 RDB 스냅샷을 생성할 때 인메모리 데이터를 디스크에 쓰기 위해 child 프로세스를 생성한다.
  • 레디스 4.0에서 도입된 ULINK 명령은 백그라운드 스레드에서 데이터를 삭제한다.
  • 레디스 6.0은 I/O 를 위한 multi-threaded 를 도입하였는데 해당 IO thread 는 네트워크 데이터의 reading, writing, parsing 을 담당한다.
    • 네트워크를 읽고쓰는 read/write 시스템 호출은 레디스 명령이 실행되는 동안 대부분의 CPU 시간을 차지하기 때문에 이런부분에 멀티스레드를 도입함으로써 성능을 향상시킬 수 있다.
    • 조금더 자세히 찾아봤는데 6.0 에서 ThreadedIO 가 적용되는 부분은 다음과 같다.
      • 클라이언트가 전송한 명령을 네트워크로 읽어서 파싱하는 부분
      • 명령이 처리된 결과 메시지를 클라이언트에게 네트워크로 전달하는 부분
    • 여전히 명령어 실행은 메인 스레드(single thread) 에서 담당하기 때문에 레디스의 Atomic 한 성격은 유지된다.

참고한 문서

https://www.sobyte.net/post/2022-08/redis-single-thread/
https://charsyam.wordpress.com/2020/05/05/%EC%9E%85-%EA%B0%9C%EB%B0%9C-redis-6-0-threadedio%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90/

profile
백엔드 개발자

0개의 댓글