2015-06-12 5 views
2

Я использую Azure Redis (используя Stackexchange.Redis) в качестве хранилища кэш-памяти и, как правило, отлично работает. Но время от времени я получаю ошибки в тайм-аутах, и я не могу понять, почему это происходит.Stackexchange.Redis timeouts & socketfailures

Мои настройки соединения Redis:

value="dev.redis.cache.windows.net,ssl=true,password=secret,abortConnect=false,syncTimeout=3000" 

Я получаю все эти исключения в той же второй (несколько звонков): [я получаю это на GET операций, а также. Почти все эти исключения находятся на StringSet & StringGet. Я редко получаю исключения на HashSets или HashGets]

Timeout performing SET {key}, inst: 1, mgr: ExecuteSelect, queue: 6, qu=0, qs=6, qc=0, wr=0/0, in=0/0 
SocketFailure on SET 
SocketFailure on SET 
No connection is available to service this operation: SET 

Я предполагаю, что установка объект занимает больше времени, чем ожидалось, это может быть связано с объектом является большой, так что я мог бы потенциально увеличить synctimeout, но это будет скрываться какая-то другая проблема?

Я получаю эти исключения только от синхронных вызовов stackexchange.redis, я не видел исключения, когда вызов асинхронный.

StackTrace:

StackExchange.Redis.RedisConnectionException: SocketFailure on SET 
    at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) i 
    at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) 
    at StackExchange.Redis.RedisDatabase.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags) 
at calling method 

Edit: Я использую StackExchange.Redis 1.0.414 пакет, и я использую MessagePack сериализовать мои объекты

ответ

3

Таймауты, как правило, вызваны одной из нескольких вещей. Вот некоторые примеры

  1. клиент или сервер CPU удара на 100%
  2. Плохо настроенные параметры Threadpool, в сочетании с очередями трафика
  3. клиенты, отправляющие дорогие команды на сервер.
  4. Maxing из сетевой полосы пропускания (на клиенте или на сервере)

Советы по стороне клиента вопросы: https://gist.github.com/JonCole/db0e90bedeb3fc4823c2

Советы по стороне сервера вопросов: https://gist.github.com/JonCole/9225f783a40564c9879d

Я бы рекомендовал обновление до более новой версия StackExchange.Redis. Версия 1.1.603 содержит более подробную диагностическую информацию в сообщении об ошибке таймаута, которое может помочь вам идентифицировать некоторые из распространенных на стороне клиента вещей, перечисленных выше.

Что касается неудач сокетов, несколько распространенных причин для соединения падает между клиентом и сервером, который я видел, являюсь:

  1. Scaling клиента - я видел проблемы на сторону подключения краткого клиента при масштабировании клиентских приложений в Лазуре.
  2. Когда Redis исправлен, появятся некоторые связи. Ламинирование Redis объясняется здесь: https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d
Смежные вопросы