프로젝트/redis

공식문서로 알아보는 Redis pipeline

Junuuu 2023. 11. 5. 00:01
728x90

Redis pipeline이란?

redis의 명령어들을 일괄로 처리하여 RTT(rount-trip-time)를 최적화하는 방법입니다.

개별 명령에 대해 응답을 기다리지 않고 한 번에 여러 명령을 실행하여 성능을 개선할 수 있습니다.

 

RTT란?

redis는 client-server 구조를 사용하는 TCP 서버입니다.

한마디로 클라이언트와 서버는 네트워크로 연결되고 네트워크는 매우 빠를 수도 느릴 수도 있습니다.

네트워크 지연 시간에 상관없이 패킷이 클라이언트에서 서버로 이동하고 서버에서 클라이언트로 다시 돌아와 응답을 전달하는 데는 시간이 걸립니다.

 

이런 시간을 RTT라고 부릅니다

 

만약 RTT 시간이 250ms인 경우 서버가 초당 10만개의 요청을 처리할 수 있더라도 초당 최대 4개의 요청만 처리할 수 있게 됩니다.

다행히도 이런 문제를 Redis pipelining으로 해결할 수 있습니다.

 

Redis pipelining

이전 응답을 아직 읽지 않은 경우에도 새 요청을 처리할 수 있도록 구현하고, 응답을 기다릴 필요 없이 여러 명령을 서버에 보내고 응답을 받을 수 있습니다.

 

pipelining을 사용하지 않는 예제

Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4

 

pipelining을 사용하는 예제

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4

 

 

RTT만의 문제는 아니다

파이프라이닝을 활용하면 단순히 네트워크 지연시간을 줄일 뿐 아니라 실제로 Redis 서버에서 처리할 수 있는 작업의 수를 크게 향상시킵니다.

Redis 서버가 각 네트워크 요청에 대해 소켓 I/O를 수행할 때 read, write의 system call이 발생하여 사용자 영역에서 커널영역으로 이동됩니다.

이때 context switch는 엄청난 속도 저하를 초래합니다.

 

 

 

참고자료

https://redis.io/docs/manual/pipelining/