레디스 성능 향상 시키기

Hwangro Lee
4 min readAug 20, 2021

--

Tcp keepalive

TCP 통신시 3-way handshake 가 필요하다. TCP 통신을 위해 반드시 지켜야하는 표준 규약이면 회피할 수 없는 방법이다. TCP 통신할때마다 3-way handshake를 진행한다면 상당한 리소스가 소모되기때이다. 통신이 지속적으로 이루어진다면 한번 열어둔 세션을 없애지 않고 사용하면 효율적이라고 판단이 되었고 이를 위해 TCP keepalive 개념이 생겨나게 되었다.

tcp keepalive 기능은 커넥션을 유지하기 때문에 새로운 요청이 왔을때 기존 커넥션을 사용하여 통신을 할 수 있다. 하지만 반대로 요청을 받아들이지 않는 좀비 커넥션이 생길 수 있다는 단점도 가지고 있다.

좀비 커넥션 생성을 막기 위해 tcp-keepalive에 초를 설정하면 설정한 시간마다 연결이 유지되었는지를 확인하고 응답을 받았다면 연결을 유지하고 응답을 받지 못한다면 소켓을 닫는다.

Redis 3.2.1 부터 기본값 300인다. 0 이라면 동작하지 않는다.

Pipeline

여러 명령어를 쓸 경우 pipeline 사용. 레디스에 커넥션을 맺고 해제하는 리소스를 줄일 수 있다.

RDB, AOF 기능은 Cluster에서는 사용 X

Cluster 환경에서는 RDB, AOF 를 활성화하지 않아도된다. 노드에 이슈가 있어도 다른 노드가 커버해주기 때문이다.

TCP backlog

레디스의 결과를 클라이언트에게 보낸 후 클라이언트로부터 잘 받았다는 신호를 받을 때까지 담아주는 큐이다. 레디스에 성능이슈가 있다면 이 부분도 살펴보면 좋다.

Info commandstats

레디스를 사용 곳에서 명령어들이 잘 사용되고 있는지 확인하는 차원에서 info commandstats 으로 명령어 통계를 보고 오래걸리는 명령어를 사용 중인 곳을 찾아 수정한다. keys, smembers, hgetall 등과 같은 O(N) 명령어는 사용하지 않도록 코드를 수정한다.

전체 통계를 보고싶다면 info all 통계를 리셋하고 싶다면 config resetstat 명령어를 사용한다.

참고사이트

--

--