2016-11-22 3 views
0

StackExchange.Redis를 사용하는 분산 웹 서비스 (WCF)가 있으며 하루에 약 5 백만 건의 요청이 있습니다.StackExchange. 많은 수의 요청에 대한 제한 시간이 초과되었습니다.

I 몇 번 (값을 가지 다른 될 수있는 시간)이 오류 방법 :

System.TimeoutException 7 큐 : 6 숨어 0, QS : 제한 시간 SISMEMBER KeyAllUsersFlag, 이달 수행 6 (Busy = 20, Free = 3180, Min = 2400, Max = 3200), 작업자 : (Busy = 0, wq : (7) 자유 = 793 분 = 400가, 최대 = 800), 로컬 - CPU : webconfig에

사용할 제가 가지고

httpRuntime을 targetFramework = "4.6.1"을, minFreeThreads = "704"minLocalRequestFreeThreads = "608"기계의 구성에

제가 가지고

이 processModel maxWorkerThreads = "100"와 maxIoThreads가 = "400"minWorkerThreads 매개 = "50"minIoThreads = "300"멀티플렉서 구성에

제가 가지고

var configurationOptions = new ConfigurationOptions 
{ 
    AbortOnConnectFail = false, 
    SyncTimeout = 2000, 
}; 

빠른 응답을하고이 오류가 발생하지 않도록 redis 호출을 otimize하려면 어떻게해야합니까?

+1

아마도 관련 https://github.com/StackExchange/StackExchange.Redis/issues/83 –

답변

1

redis 서버에 대한 연결 수에 문제가있을 수 있습니다. TCP 포트를 통해 연결이 설정됩니다. 단일 원본 IP가 단일 대상 IP 및 포트에 대해 만들 수있는 TCP 세션의 최대 수는 65,535입니다. 이것은 소스 IP에서 16 비트 소스 포트 범위 (0 제외)에있는 모든 사용 가능한 소스 포트가 사용된다고 가정합니다. 실제로 대부분의 운영 체제는 클라이언트가 사용하는 포트 유형 인 emphemeral 소스 포트 만 생성합니다. 포트 32768 (0-65535 범위의 후반에있는 가장 낮은 번호)입니다. 즉, 하나의 대상 IP 및 수신 대기 포트에 최대 32,768 개의 연결을 구성 할 수 있습니다. 분명히 다른 리소스 제약 조건으로 인해이를 막을 수는 있지만 이론상의 최대 값입니다. 긴 이야기를 짧게 작성하려면 - 작업자가 작업을 마친 후에 연결을 종료해야합니다 (SISMEMBER 명령). 오류 메시지는 사용 가능한 작업자가 있지만 redis 서버에 연결할 수 없으며 클라이언트 시간 초과로 인해 실패 함을 나타냅니다. 연결 수를 확인하십시오. 사용 가능한 연결량이 부족한 경우 연결에 keepAlive 옵션을 사용하십시오. 또한 connectTimeout 옵션을 사용하여 연결 작업 시간 제한 (ms)을 설정하고 connectRetry를 사용하여 초기 연결 명령 중에 연결 시도 횟수를 설정할 수 있습니다.