복붙노트

[REDIS] StackExchange.Redis를 사용 RedisTimeoutException의 버스트

REDIS

StackExchange.Redis를 사용 RedisTimeoutException의 버스트

나는 StackExchange 레디 스 라이브러리를 사용하여 시간 초과 간헐적으로 "버스트"를 추적하기 위해 노력하고있어. 여기에 우리의 설정에 대한 약간의 : 우리의 API는 윈도우 2008 및 IIS에 C # 및 실행에 기록됩니다. 우리는 생산에 4 개 API 서버가, 우리는 (리눅스 최신 LTS를 실행) 4 레디 스 기계, 레디 스 2 인스턴스 (포트 7000에 하나의 마스터, 포트 7001에 슬레이브) 각이있다. 나는 레디 스 서버의 거의 모든 측면을 검토 한 결과 그들은 환상적인 보인다. 아니 로그, CPU 오류와 네트워크가 큰는 사물의 서버 측에 모든 환상적인 보이지 않는다. 나는 이런 일이 (예 : 재 작성 AOF 파일 또는 아무것도 등) 일반 중 아무것도 표시되지 않는 상태에서 레디 스 -f 꼬리를 기록 할 수 있습니다. 나는 문제가 레디 스로 생각하지 않습니다.

여기에 지금까지 무엇을 알고 :

여기에 예를 들어 시간 제한 예외입니다. 거의 같은이 같은 대부분의보기 :

나는이 시간 제한 예외를 아래로 추적에 대한 연구의 조금을 완료,하지만 오히려 놀라운 것은 모든 숫자 모두 0입니다입니다했습니다. 큐에 아무것도, 아무것도 대기 나는 자유와 아무것도하지 스레드의 톤이 처리되지 않을 수 있습니다. 모든 것이 멋지다.

누군가는이 문제를 해결하는 방법에 대한 아이디어가? 문제는 캐시 시간 제한의 이러한 버스트는 우리의 데이터베이스가 더 타격되도록하고, 특정 상황이 나쁜 것입니다. 나는 누군가가 도움 것이 더 이상 정보를 추가 할 행복 해요.

업데이트 : 연결 코드

레디 스에 연결하는 코드는 다양한 캐시 환경과 구성을 지원하는 상당히 복잡한 시스템의 일부입니다,하지만 난 아마도 기본에로 요약 할 수 있습니다. 첫째, CacheFactory 클래스가있다 :

public class CacheFactory : ICacheFactory
{
    private static readonly ILogger log = LoggerManager.GetLogger(typeof(CacheFactory));
    private static readonly ICacheProvider<CacheKey> cache;

    static CacheFactory()
    {
        ICacheFactory<CacheKey> configuredFactory = CacheFactorySection.Current?.CreateConfiguredFactory<CacheKey>();
        if (configuredFactory == null)
        {
           // Some error handling, not important
        }

        cache = configuredFactory.GetDefaultCache();
    }

    // ...
}

ICacheProvider 구성 할 수 있습니다 특정 캐시 시스템, 이야기 할 수있는 방법을 구현하는 것입니다. 이 경우, configuredFactory은 다음과 같이 보이는 RedisCacheFactory입니다 :

public class RedisCacheFactory<T> : ICacheFactory<T> where T : CacheKey, ICacheKeyRepository
{
    private RedisCacheProvider<T> provider;
    private readonly RedisConfiguration configuration;

    public RedisCacheFactory(RedisConfiguration config)
    {
        this.configuration = config;
    }

    public ICacheProvider<T> GetDefaultCache()
    {
        return provider ?? (provider = new RedisCacheProvider<T>(configuration));
    }
}

GetDefaultCache 방법은 정적 생성자에 한 번이라고하고, RedisCacheProvider을 반환합니다. 이 클래스는 실제로 레디 스에 연결하는 것입니다 :

public class RedisCacheProvider<K> : ICacheProvider<K> where K : CacheKey, ICacheKeyRepository
{
    private readonly ConnectionMultiplexer redisConnection;
    private readonly IDatabase db;
    private readonly RedisCacheSerializer serializer;
    private static readonly ILog log = Logging.RedisCacheProviderLog<K>();
    private readonly CacheMonitor<K> cacheMonitor;
    private readonly TimeSpan defaultTTL;
    private int connectionErrors;

    public RedisCacheProvider(RedisConfiguration options)
    {
        redisConnection = ConnectionMultiplexer.Connect(options.EnvironmentOverride ?? options.Connection);
        db = redisConnection.GetDatabase();
        serializer = new RedisCacheSerializer(options.SerializationBinding);
        cacheMonitor = new CacheMonitor<K>();
        defaultTTL = options.DefaultTTL;

        IEnumerable<string> hosts = options.Connection.EndPoints.Select(e => (e as DnsEndPoint)?.Host);
        log.InfoFormat("Created Redis ConnectionMultiplexer connection.  Hosts=({0})", String.Join(",", hosts));
    }

    // ...
 }

생성자 (일부 구성 파일에) 구성된 레디 스 끝점에 기초 ConnectionMultiplexer를 생성한다. 나는 또한 연결을 만들 때마다 로그인합니다. 우리는 이러한 로그 문 과도한 수를 확인하지 않으며, 레디 스에 대한 연결이 안정적으로 유지.

해결법

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

    1.Global.asax에에에하는 추가 시도 :

    Global.asax에에에하는 추가 시도 :

    protected void Application_Start(object sender, EventArgs e)
    {
        ThreadPool.SetMinThreads(200, 200);
    }
    

    우리에게이 일 ~ 50 ~ 100에서 제로로 오류를 감소시켰다. 그래서 최종에 실험 일부가 필요할 수 있습니다 의존 그것의 시스템과 같은 세트에 어떤 숫자 (우리를 위해 200 개 작품)에 대한 일반적인 규칙이 없다 생각합니다.

    나는이 사이트의 성능을 개선했다 생각합니다.

  2. from https://stackoverflow.com/questions/51936394/bursts-of-redistimeoutexception-using-stackexchange-redis by cc-by-sa and MIT license