Redis 성능에 영향을 주는 요소들에 대해 정리해보려고 합니다.
(자세한 내용은 https://redis.io/topics/benchmarks 를 훑어보면 됩니다.)
초창기에 Redis를 있는 그대로 사용하게 되면 디폴트 설정들로 인해 웬만해서는 잘 동작합니다. (평균적인 성능을 보장합니다.)
하지만 좀 더 advanced하게 쓰기 위해서 몇몇 설정을 변경할 수 있고 그로인해 성능이 더 떨어질 수도(?)있고 더 잘 나올 수도 있습니다.
몇몇 가지 확인해 보겠습니다.
1. Network bandwidth & latency
2. CPU
3. RAM speed & memory bandwidth
4. Virtualization
5. TCP/IP loop back & unix domain socket
6. Pipelining
7. NUMA
8. Client Connection
9. NIC
10. Memory allocator
대략 10가지로 구분됩니다.
먼저 Redis 성능은 네트워크에 영향을 많이 받습니다. 물론 latency가 낮다고 초당 많은 쿼리를 보낼 수는 없습니다. 네트워크의 한계가 있기 때문입니다. (CPU에서 모든 요청을 처리 할 수 있더라도 말입니다.)
그래서 Redis 문서에서는 2가지를 추천합니다. (10 Gbit/s NIC 또는 TCP/IP bonding한 1 Gbit/s NICs )
두 번째로 CPU입니다. Redis는 싱글 스레드를 사용합니다. 때문에 대용량 캐시가 있는 고속 CPU를 선호합니다. (CPU core가 많은 것은 선호하지 않습니다.)
세 번째로 RAM 입니다. RAM은 성능이 좋긴하지만 성능보다 중요한 가격이라는 부분이 있습니다. 실제로 Redis 상에서도 사이즈가 작은 object에는 영향이 미비합니다. 다만, 10KB보다 큰 object에는 영향이 클 수 있습니다. 비용과 성능의 tradeoff를 잘 따져봐야 합니다.
네 번째로 가상화입니다. 물론 가상화 없이 Redis를 사용하는 것을 추천합니다.
Redis가 일반적인 환경 (서버에 Redis를 바로 설치하는..)이 좋긴하지만 그렇다고 가상화에 Redis를 올리면 느려진다는 것은 아닙니다.
일반적인 환경에서도 잘 동작하긴하는데 가상화의 내부 이슈로 Redis가 크리티컬한 영향을 받을 수 있습니다. (예컨데 가상화 환경을 만들면서 가져가는 리소스로 인해 생기는 이슈들이나 내부 시스템 콜 등)
물론 적절한 가상화 환경 구축은 사용자의 몫입니다.
다섯 번째로 TCP/IP loopback과 unix domain socket 입니다. 플랫폼에 따라 unix domain socket의 성능이 약 50% 더 나올 수 있습니다.
(Redis의 기본 설정은 TCP/IP loopback입니다.) 그렇지만 pipelining을 사용했을 때 unix domain socket의 성능은 좀 더 떨어지는 경향이 있습니다.
여섯 번째로 Pipelining입니다. Pipelining을 사용할 때 크기에 상관 없이 처리 결과가 일정합니다.
(크기에 상관없다는 것은 ethernet packet size의 크기 안에서를 의미합니다.)
위의 그래프를 통해 확인 할 수 있겠지만, 100, 1000 bytes 에서는 처리량이 동일한 것을 확인 할 수 있습니다.
일곱 번째로 NUMA입니다. Redis는 NUMA의 구성에 따라 성능이 달라집니다.
위의 표에서 확인 할 수 있듯이, 제조사와 그 내부 설정에 따라 TPS의 성능이 달라집니다.
여러 설정이 있겠지만 해당 문서에서 가장 좋은 성능을 얻기 위해서는 같은 CPU에 각기 다른 코어를 클라이언트와 서버로 사용하는 것이 좋다고 합니다.
(해당 방법은 로컬에서 CPU를 효과적으로 사용하는 방법을 뜻하는 것 같습니다.)
여덞 번째로 클라이언트의 커넥션(Connection)의 개수입니다.
일반적으로 Redis는 60,000개 이상의 커넥션을 받아 줄 수 있다. (초당 50,000 쿼리 일때..)
물론 아래의 표를 확인하면 쿼리 및 커넥션 개수의 상관 관계를 알 수 있습니다.
아홉 번째로 NIC 튜닝입니다. 당연하겠지만 NIC의 affinity (즉, Rx/Tx NIC queue와 CPU cores 등)을 튜닝하면 처리량이 향상됩니다.
마지막으로 memory allocator입니다. 3번 째에서 설명한 것과 비슷할 수도 있지만 3번 째에서 언급한 memory는 물리적인 것을 뜻하고 여기서 의미하는 것은 programming적인 요소를 뜻합니다.
Redis는 플랫폼마다 메모리 할당하는 라이브러리가 다르기 때문에 메모리 연산 속도에 차이가 발생 할 수 있습니다.
여기까지 Redis 성능에 영향을 끼치는 요소 10가지를 알아 보았습니다. 하지만 Redis의 성능은 결국 사용자의 몫으로 10가지 요소를 잘 따져보고 tradeoff를 해야 한다는 것입니다.
'IT > Database' 카테고리의 다른 글
MCC (Multiversion Concurrency Control) (0) | 2019.02.19 |
---|---|
[Redis] Cluster Redirection (0) | 2019.01.06 |
[Redis] Cluster Overview (1) | 2019.01.06 |
[Redis] Partitioning (0) | 2018.12.10 |
댓글