2013-05-30 5 views
15

우리는 캐싱을 위해 웹 응용 프로그램을 실행하고 memcached에서 redis (2.4)로 전환했습니다. 이제 우리는 redis 성능에 다소 실망합니다. Redis는 동일한 서버에서 실행되며 아주 간단한 GET 및 SET 작업 만 사용합니다. 캐시 된 값을 많이 사용하는 일부 요청에는 redis에 최대 300 건의 GET 요청이 있지만 이러한 요청에는 최대 150ms가 소요됩니다. 우리는 약 200,000 개의 활성 키와 초당 약 1,000 개의 재발행 요청을 가지고 있습니다. disk io, ram 또는 cpu에는 문제가 없습니다. 기존 코드 덕분에 단순히 redis 요청을 그룹화 할 수 없습니다. Memcached는 약 4 배 빠릅니다. 우리가 redis에 대해 좋아하는 점은 캐시 온난화가 필요 없으며 앞으로 더 많은 고급 데이터 저장소 기능을 사용할 수 있다는 것입니다. 우리는 redis가 memcached와 비슷한 기능을 수행 할 것으로 예상했습니다. 그래서 우리는 기본적으로 기본 구성 인 구성에서 뭔가를 놓쳤을 것입니다.Redis 성능 튜닝

redis 성능 조정에 대한 모범 사례에 대해 알고 있습니까?

+0

Redis가 동일한 서버에서 실행되고 있습니까? 클라이언트, 또는 memcached를 실행중인 클라이언트? Redis 요청에 대해 150ms는 스왑/디스크가 아닌 메모리를 사용하는 것처럼 들리겠습니까? 아니면 300 개의 요청 모두에 대해 150ms를 의미합니까? –

+0

초당 약 100 개의 아파치 요청을 가진 웹 애플리케이션입니다. Redis는 웹 응용 프로그램 자체와 mysql 데이터베이스 서버와 같은 호스트에서 실행되지만 곧 Apache 3 개를로드 균형 서버로 옮길 계획입니다. 현재 서버에는 약 64GB의 RAM이 있으며 redis에는 약 100MB가 필요합니다. 충분한 양의 램이 있고 cpu 나 io에는 문제가 없습니다. 서버가 디스크로 스왑하지 않습니다. 그리고 네, 300 요청에 대해 150ms를 의미하지만, memcached는 동일한 조건 하에서 40ms 밖에 걸리지 않았습니다. – ak2

+1

내가 생각할 수있는 것은 웹 요청 당 하나가 아닌 모든 요청에 ​​대해 Redis에 대한 공유 연결을 사용하고 있다면 Redis에 대기 시간 문제가있을 수 있지만 초당 1000 요청에서는 나쁜 대기 시간을 보지 말아야한다는 것입니다. 죄송합니다. 오늘 내 방향에서 도움이되는 것은 아무 것도 없습니다. –

답변

21

먼저, the Redis benchmark page을 읽고 싶을 수 있습니다. Redis 조정을 확인하기위한 주요 요점에 대한 좋은 요약을 제공합니다.

파이프 라이닝을 사용하지 않는다고 가정해도 150ms 동안 300GET이 효율적이지 않습니다. 평균 대기 시간이 500 us임을 의미합니다. 그러나 실제로는 개체의 크기에 따라 다릅니다. 개체가 클수록 대기 시간이 길어집니다. 아주 오래된 2GHz AMD 박스에서, 작은 물체 (수 바이트)에 대한 대기 시간을 150 us 측정 할 수 있습니다.

빠르게 레디 스 인스턴스의 평균 대기 시간을 확인하려면, 당신은 사용할 수 있습니다

$ redis-cli --latency 

이 옵션을 얻을 최근 레디 스 버전 (안 2.4)을 사용하십시오. 참고 : 2.4는 꽤 오래되었습니다. Redis 2.6을 사용하십시오. 필요하다면 Redis 버전을 컴파일하십시오. 정말 간단합니다.

신속 대기 시간을 공부하는 벤치 마크를 실행하려면, 당신은 실행할 수 있습니다 :

$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes 

은 고유 한 연결없이 파이프 라인으로 실행되므로 대기 시간은 처리량에서 추론 할 수있다. 이 벤치 마크의 결과를 응용 프로그램으로 측정 한 수치와 비교해보십시오.

  • 레디 스 클라이언트 라이브러리

    당신이 사용합니까 :

    검사 할 수 있습니다 포인트가 있습니다? 어떤 개발 언어로? 일부 스크립팅 언어의 경우 효율적인 클라이언트를 얻으려면 hiredis 모듈을 설치해야합니다.

  • 컴퓨터가 VM입니까? 어떤 OS 에서요?
  • Redis에 대한 연결이 지속됩니까? (즉, 앱 서버의 각 HTTP 요청에 연결/연결 해제하지 않아야 함).

왜 memcached가 더 좋습니까? 글쎄요, 하나의 memcached 인스턴스는 확실히 확장 성이 뛰어나며 다중 스레드에서 실행될 수 있기 때문에 단일 Redis 인스턴스보다 응답 성이 좋습니다. Redis는 빠르지 만 단일 스레드로 - 모든 명령의 실행이 직렬화됩니다. 따라서 명령이 연결을 위해 진행 중일 때 다른 모든 클라이언트는 대기해야합니다. 주어진 명령의 대기 시간이 길면 모든 보류중인 명령에도 영향을 미칩니다. 일반적으로 낮은 처리량에서는 성능이 비슷합니다.

1000q/s (Redis 또는 memcached 표준의 낮은 처리량)에서 클라이언트 측 (즉, 클라이언트 측)에 문제가있을 확률이 더 높습니다.클라이언트 라이브러리 선택, 연결/연결 끊기, 등등 ...), Redis 서버 자체보다.

마지막으로 HTTP 요청 당 여러 개의 Redis 쿼리를 생성하는 경우 최대한 멀리 Redis에 보내는 명령을 pipelining으로 간주해야합니다. 효과적인 Redis 응용 프로그램을 개발하는 것이 핵심 포인트입니다.

응용 프로그램 서버가 Redis와 동일한 상자에있는 경우 TCP 루프백 대신 UNIX 도메인 소켓을 사용하여 Redis에 연결할 수도 있습니다. 성능을 약간 향상시킵니다 (파이프 라이닝을 사용하지 않을 때 최대 처리량이 50 % 증가).

+0

"모든 명령의 실행이 직렬화됩니다."이 진술에 대한 자세한 내용을 알려주십시오. 나에게 그것은 명령이 다른 명령을 실행하지 않는 동안 다른 연결에서도 실행될 수 있다고 말하는 것처럼 들린다. 그것이 redis가 명령 원 자성을 달성하는 방법입니까? – akonsu

+0

예. http://stackoverflow.com/questions/10489298/redis-is-single-threaded-then-how-does-it-do-concurrent-io/10495458#10495458 –

+0

http://redis.io/topics를 참조하십시오. /숨어 있음 –

0

redis가 OS 스왑 메모리를 사용하고 있는지 확인하십시오. 그러면 대기 시간이 추가됩니다. 이 알아 보려면 여기를 "교환에 의해 유도 대기 시간"에 대한 검색 : http://redis.io/topics/latency

서버 하드웨어가있는 NUMA, numactl은 더 나은 시작 레디 스 서버 인 경우. NUMA를 사용하여 redis-server를 시작하는 경우 sysctl에서 영역 교정 모드 (vm.zone_reclaim_mode = 0)를 해제하는 것을 잊지 마십시오.

0

Lua 스크립트 내에서 300GET 요청을 스크립팅하도록하십시오. 클라이언트 코드가 Redis에 로컬로 실행 중이더라도 TCP/IP 스택에 대한 터치 시간을 절약 할 수 있으므로 더 빨리 작동해야합니다.