문제

설치 redis 및형에 CentOS6.4.와 연결 시도를 사용하여 ServiceStack.Redis 클라이언트입니다.을 발견 주요 성능 문제입니다.

테스트 왼쪽만 1redis 인스턴스

beta:
  listen: 0.0.0.0:22122
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  #timeout: 5000
  #server_retry_timeout: 2000
  #server_failure_limit: 3
  redis: true
  servers:
  #- 127.0.0.1:6379:1
   - 127.0.0.1:6380:1

에서 다음과 같은 단위 테스트 나를 보내려고 100k 문자열을 redis 을 통해까요?

[TestClass]
public class RedisProxyTest
{
    public string host = "192.168.56.112";
    //public int port = 6379;
    public int port = 22122;

    [TestMethod]
    public void TestMethod1()
    {
        var key = "l2";
        var count = 100000;
        using (var redisClient = new RedisClient(host, port))
        {
            var list = new List<string>();
            for (int i = 0; i < count; i++)
            {
                list.Add(Guid.NewGuid().ToString());
            }

            Utils.TimeLog("Remove", () => redisClient.Remove(key));

            Utils.TimeLog("AddRangeToList", () => redisClient.AddRangeToList(key, list));
        }

        using (var redisClient = new RedisClient(host, port))
        {
            redisClient.GetListCount(key);

            Utils.TimeLog("GetRangeFromList", () =>
            {
                var ret = redisClient.GetRangeFromList(key, count / 2, count - 1);
                Console.WriteLine(ret.Count);
            });
        }

    }
}

에 처음 몇 후 실행형 다시 시작 AddRangeToList 와 함께 작동 1-2sec.하지만 후속 실행 AddRangeToList 성능이 크게 떨어진에서 몇 분 정도 이상 20 분(지 않은 경우 시간 제한을 구성).나는 재생할 수 없는 동일한 사용할 때 redis 직접 있습니다.시도 하지 않았 다른 어떤 클라이언트 아직입니다.어떤 아이디어를 왜?

이에서 무엇을 보고 후에 콘솔 단위 테스트 실행

Test Name:  TestMethod1
Test Outcome:   Passed  
Remove: 0.0331171
AddRangeToList: 806.8219166
50000
GetRangeFromList: 1.741737
도움이 되었습니까?

해결책

면형가 proxing 여러의 수천 수만 연결을 보내거나 다 get 요청을 여러 가지 수천 개의 키를 사용해야 합니다 mbuf 크기의 512

다음과 같은 링크에 대해 이야기를 해석하는 방법 mbuf 크기는?- https://github.com/twitter/twemproxy/issues/141

모든 클라이언트 연결이 소비에 적어도 하나의 mbuf.하는 서비스 요청에 우리가 필요한 두 개의 연결(하나에서 클라이언트가 프록시와는 다른 에서 프록시하는 서버).그래서 우리는 것이요 두 mbufs.

A fragmentable 와 같은 요청을 얻을'foo 바 '는 btw 져 조각이'foo 'and'get 바 '소비하는 것 두 mbuf 에 대한 요청을 두 mbuf 응답합니다.그래서 fragmentable 요청 N 각 필요 N*2mbufs

좋은 일에 대한 mbuf 는 메모리에서 다시 사용 수영장도 있습니다.한 번 mbuf 할당,그것은 결코 해하지만 그냥 넣어로 다시 재이용 수영장도 있습니다.나쁜 것은 일단 mbuf 할당 그것은 해방 이후 해방 mbuf 항상을 재사용할 수영장 https://github.com/twitter/twemproxy/blob/master/src/nc_mbuf.c#L23-L24 (이 문제를 해결할 수 있습니다 의 임계값을 매개 변수를 재이용 수영장)

경우에 따라서,형 처리 말 1K 클라이언트 연결 및 100 서버에 연결,그것은 소비하는 것(max(1000,100)*2*mbuf 크기)메모리 mbuf.라고 가정하면 클라이언트가 보내는 비 파이프라인 요청,한 다음 기본 mbuf 크기의 16K 이에는 총 소비 32M.

또한,만약에 평균 모든 요청이 있 10 조각,다음 메모리 소비가 될 것입 320M.대신 처리 1K 클라이언트 연결,당신이 말할 수 있습이었다 처리 10K,다음 메모리 소비가 될 것입 3.2G.지금 대신 사용하여 기본 mbuf 크기의 16K 사용할 수 512bytes,다음 메모리 소비를 위해 동일한 시나리오에는 떨어질 것이다 1000 * 2 * 512 * 10 =10M

는 이유입니다'에 대한 많은 수의 연결에 당신을 선택하려면에 작은 값을 mbuf-같은 크기 512

다른 팁

는 해당 데이터를 전송할 때 문제가 높은 메모리 사용과 관련된 것처럼 보입니다.

기본적으로 NutCracker는 각 키에 대해 16K 버퍼 크기를 할당합니다.내 경우에는 16k * 100000= 1.5GB 가 될 것입니다.나는 호두 까기 인형 과정을 볼 때 약 2GB 피크를 보았습니다.My Cent OS VM을 오버로드하고 그 스파이크를 처리 할 충분한 메모리가 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top