2016-11-01 2 views
4

StackExchange.Redis를 사용할 때 시간 초과 문제가 있습니다. 내가 stackoverflow에서 찾을 수있는 모든 것을 시도했다. 난 단지 queueqs 변화 얻을 거의 모든 예외에 Timeout performing GET XXX, inst: 4, mgr: ProcessReadQueue, err: never, queue: 9, qu: 0, qs: 9, qc: 0, wr: 0, wq: 0, in: 65536, ar: 1, IOCP: (Busy=0,Free=1000,Min=400,Max=1000), WORKER: (Busy=35,Free=32732,Min=400,Max=32767)StackExchange.Redis timeouts GET

하고 11 최대 값을했다 : 여기

내가 얻고 것입니다.

나는 너겟 버전 1.0.488을 사용하고 있습니다. 응용 프로그램은 Windows Server 2012의 IIS 8.5에서 호스팅됩니다.이 컴퓨터에는 32GB의 RAM이 있으며 30-50 %에서 사용됩니다. maxmemory16gb으로 설정하고 maxheap을 22GB로 설정했습니다. 디스크에 저장이 비활성화되었습니다. 세션 저장 장치로만 사용하고 있습니다.

Redis 서버 (버전 x64-2.8.2402)가 동일한 컴퓨터에 설치되어 있습니다. 여기에 내가 가지고있는 redis-cli info에 대한 URL이 있습니다. 내 연결 문자열 <add key="LocalRedis" value="127.0.0.1:6379,connectTimeout=25000,allowAdmin=true,password=xxx" />을 찾는 방법

System.TimeoutException: Timeout performing GET Airports, inst: 1, mgr: ProcessReadQueue, err: never, queue: 4, qu: 0, qs: 4, qc: 0, wr: 0, wq: 0, in: 65536, ar: 1, IOCP: (Busy=0,Free=1000,Min=400,Max=1000), WORKER: (Busy=20,Free=32747,Min=400,Max=32767), clientName: OWNEROR-G875DJG at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1927 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:line 80 at StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags flags) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs:line 1451 at Resvoyage.Services.RedisCacheProvider.GetValue[T](String key) in c:\Development\thomalex\resvoyage\Resvoyage.Services\RedisCacheProvider.cs:line 88 

이는 다음과 같습니다

은 또한이 내가 점점 오전 예외의 일부입니다. 은 ConnectionTimeout은 15000이었고, 나는 또한 IIS에 대한 machine.configminIoThread을 증가 25000

에 incresing했습니다. 다음은 내가 배치 한 값입니다. <processModel autoConfig="true" minIoThreads="50" minWorkerThreads="50" maxWorkerThreads = "100" maxIoThreads = "100"/>

답변

3

redis slowlog를 읽으면 redis에 느린 쿼리가 있는지 확인하십시오. 어쩌면 키 명령을 사용하고 있습니까? Redis는 단일 스레드이므로 하나의 느린 쿼리가 모든 것을 차단할 수 있으며 클라이언트가 시간 초과로 영원히 redis를 기다리지 않으므로 시간 초과가 발생합니다.

+0

slowlog는 내가 느린 일부 SETEX가 있음을 보여주었습니다. 그것이 시간 초과를 직접 일으키는 지 확실하지 않습니다. 저장할 때 최대 7MB의 데이터가 있습니다. 여기에 내가 얻은 예가 있습니다 : 1) (정수) 3852 2) (정수) 1478858333 3) (정수) 19014 – zoranpro

+0

7MB BLOB 쓰기는 단일 스레드를 차단하는 과중한 작업입니다. 어떤 방법으로 크기를 줄일 수 있습니까? – edlerd

+0

아니요. 제 3 자 서비스에서 반환 된 데이터를 저장하고 있으며 그 크기가 다를 수 있습니다. – zoranpro