복붙노트

[REDIS] 어떻게 레디 스 서버의 CPU 사용량을 개선하기 위해?

REDIS

어떻게 레디 스 서버의 CPU 사용량을 개선하기 위해?

우리 레디 스 서버가 생산에 80 %의 CPU 사용률에 대한 공격을 위해 내 목표이다. 이것은 우리가 아래-활용 또한 성장과 스파이크에 대한 몇 가지 헤드 룸을 유지하면서 CPU를하지 않습니다 보장함으로써 우리의 백엔드 서버 설계에 도움이됩니다.

레디 스 '자신의 벤치 마크 도구 레디 스 벤치 마크를 사용하는 동안, 그것은 100 % CPU 사용에 대한 도달하는 것은 매우 쉽습니다 :

    $ redis-benchmark -h 192.168.1.6 -n 1000000 -c 50

이 벤치 마크에, 우리는 우리의 레디 스 서버에 백만 요청을 밀어 (50) 클라이언트를 할당.

(예 : 레디 스 - 루아 나 webdis 같은) 다른 클라이언트 도구를 사용하는 동안 그러나, 최대 CPU 사용률은 60 % 미만이다.

나는 webdis와 레디 스 - 루아에서 일부 코드를 찾아. webdis는 hiredis에 따라 달라지며 레디 스 - 루아는 루아에서 구현되며, 소켓 (루아 소켓)에 따라 달라집니다.

이러한 클라이언트가 너무 느린 레디 스 벤치 마크와 비교하고, 레디 스 CPU 소비를 극대화 할 수 없습니다 있습니까?

또한 레디 스 - benchmark.c에서 일부 코드를 찾아. 벤치 마크의 주요 작업은 aeMain에서 이루어집니다. 그것은 레디 스 - 벤치 마크 레디 스에서 빠른 코드를 사용하는 것 같아, 내 테스트 클라이언트 (webdis와 레디 스 - 루아)하지 않습니다.

현재 내 클라이언트는 두 가지 선택이있다 :

그러나이 두 레디 스 'CPU 사용률 (60 % 이하)을 극대화하지 않습니다. 다른 선택이 있습니까?

또는, 완전히 레디 스 벤치 마크 도구 자체의 레디 스 서버의 외부를 이용할 수있다?

해결법

  1. ==============================

    1.나는 당신의 백엔드 디자인 도움이됩니다 레디 스의 CPU 사용량을 극대화 의심한다. 올바른 질문은 레디 스 주어진 대기 시간에 당신의 처리량을 유지하기 위해 효율적으로 충분히인지 오히려입니다. 레디 스는 단일 스레드 서버입니다 : 80 %의 CPU 소비에서, 대기 시간은 가능성이 아주 나쁜 것입니다.

    나는 당신의 백엔드 디자인 도움이됩니다 레디 스의 CPU 사용량을 극대화 의심한다. 올바른 질문은 레디 스 주어진 대기 시간에 당신의 처리량을 유지하기 위해 효율적으로 충분히인지 오히려입니다. 레디 스는 단일 스레드 서버입니다 : 80 %의 CPU 소비에서, 대기 시간은 가능성이 아주 나쁜 것입니다.

    레디 스 - 벤치 마크는 레디 스 CPU의 소비를 증가하기 전에 귀하의 요구에 대한 수용 있는지 확인하기 위해 노력하는 동안 당신이 대기 시간을 측정하는 것이 좋습니다. 레디 스-CLI의 --latency 옵션이 사용될 수있다 :

    이제, 당신이 정말로 레디 스의 CPU 소비를 늘리려면, 당신이 필요하거나 클라이언트 프로그램 중 하나를 여러 인스턴스를 동시에 여러 연결을 처리 할 수 ​​(레디 스 벤치 마크 등) 효율적인 클라이언트 프로그램.

    루아는 빠른 해석 언어이지만, 여전히 해석 언어입니다. 그것은 느린 C 코드에 비해 크기 중 하나 개 또는 두 개의 주문 될 것입니다. 레디 스는 고유 루아 클라이언트와 레디 스 포화 할 수 없습니다, 그래서 루아 - 레디 스보다 자사의 프로토콜을 생성 / 분석에 훨씬 빠릅니다 (제외 당신이 (O를 사용하는 경우 n)의 레디 스 명령 - 참조 이상).

    webdis 효율적인 클라이언트 라이브러리, C로 구현하지만, 더 자세한 정보와 레디 스 프로토콜보다 더 복잡 할 일어나는 HTTP / JSON 프로토콜을 분석해야한다. 그것은 아마 대부분의 작업에 대한 레디 스 자체보다 더 많은 CPU를 소비한다. 그래서 다시, 당신은 하나의 webdis 인스턴스와 레디 스 포화되지 않습니다.

    여기에 여러 루아 고객과의 포화 레디 스에 대한 몇 가지 예입니다.

    아직 수행하지 않으면, 당신이 먼저 레디 스 벤치 마크 페이지를 참조했다 좋습니다.

    당신은 레디 스 같은 상자에 벤치 마크를 실행하는 경우 :

    핵심은 레디 스에 코어를 바치고, 다른 코어에서 클라이언트 프로그램을 실행하는 것입니다. 리눅스에서, 당신은이를 위해 taskset 명령을 사용할 수 있습니다.

    # Start Redis on core 0
    taskset -c 0 redis-server redis.conf
    
    # Start Lua programs on the other cores
    for x in `seq 1 10` ; do taskset -c 1,2,3 luajit example.lua & done
    

    루아 프로그램은 처리량을 최대화하고 시스템 활동을 줄이기 위해 파이프 라인을 사용해야합니다.

    local redis = require 'redis'
    local client = redis.connect('127.0.0.1', 6379)
    for i=1,1000000 do
        local replies = client:pipeline(function(p)
        for j=1,1000 do
                local key = 'counter:'..tostring(j)
                p:incrby(key,1)
            end
        end)
    end
    

    당신이 (6 개 코어가 잘되어야 상자)이 방법으로 포화 레디 스에 4 개 이상의 코어를 필요로하므로 내 시스템에서 루아 프로그램은 레디 스의 4 개 이상의 배의 CPU를합니다.

    당신은 레디 스보다 다른 상자에 벤치 마크를 실행하는 경우 :

    당신이 CPU에 굶주린 가상 머신에서 실행하는 경우를 제외하고, 병목 가능성이 경우에 네트워크가 될 것입니다. 난 당신이 적은 1 개 기가비트 이더넷 링크보다 더 아무것도 레디 스 포화 수 있다고 생각하지 않습니다.

    당신이 (이전 루아 프로그램 참조) 할 수있는 네트워크 대기 시간 병목 현상을 방지하기 위해, 그리고 (이더넷 패킷 충전) CPU에서 네트워크 인터럽트의 비용을 절감 멀리로 쿼리 파이프 라인에 있는지 확인하십시오. 네트워크 카드에 바인딩 (네트워크 인터럽트 처리)되지 않은 코어 레디 스를 실행 해보십시오. 이 마지막 점을 확인 htop 같은 도구를 사용할 수 있습니다.

    당신이 할 수있는 경우 네트워크의 여러 다른 시스템에 루아 클라이언트를 실행 해보십시오. 다시는 (6-10 괜찮을) 레디 스를 포화 루아 고객의 좋은 번호가 필요합니다.

    어떤 경우에는, 고유 루아 과정은 충분하다 :

    지금, 각 쿼리 비싼만큼 인 경우 하나의 루아 클라이언트와 레디 스 포화하는 것이 가능하다. 다음은 그 예이다 :

    local redis = require 'redis'
    local client = redis.connect('127.0.0.1', 6379)
    
    for i=1,1000 do
        local replies = client:pipeline(function(p)
            for j=1,1000 do
                p:rpush("toto",i*1000+j)
            end
        end)
    end
    
    N = 500000
    for i=1,100000 do
        local replies = client:pipeline(function(p)
            for j=1,10 do
                p:lrange("toto",N, N+10)
            end
        end)
    end
    

    이 프로그램은 1M 항목과 목록을 채운 다음 목록 (레디 스에 대한 최악의 경우)의 중간에서 10 개 항목을 가져 lrange 명령을 사용합니다. 쿼리가 실행될 때마다 그래서, 500K 항목은 서버에서 검색됩니다. 10 항목이 반환되어 있기 때문에 CPU를 소비하지 않습니다 루아 - 레디 스에 의해 구문 분석 빠르다. 이 경우 모든 CPU 소모가 서버 측에있을 것입니다.

    최종 단어

    레디 스 - 루아 것보다 아마도 더 빠른 레디 스 클라이언트가 있습니다 :

    당신은 그 (것)을 시도 할 수 있습니다.

  2. from https://stackoverflow.com/questions/16209605/how-to-improve-redis-servers-cpu-usage by cc-by-sa and MIT license