Время ожидания StackExchange.Redis истекает с момента подключения к Azure Redis

Сообщение об исключении: Тайм-аут выполнения GET allBots, inst: 1, mgr: Inactive, err: never, queue: 7, qu: 0, qs: 7, qc: 0, wr: 0, wq: 0, in: 65536, ar: 0, IOCP: (Занят = 2, Свободен = 998, Мин = 1, Макс = 1000), РАБОЧИЙ: (Занят = 0, Свободен = 2047, Мин = 1, Макс = 2047)

Тайм-аут выполнения GET stock_by_symbol_leg.to, inst: 1, mgr: Inactive, err: never, queue: 13, qu: 0, qs: 13, qc: 0, wr: 0, wq: 0, in: 0, ar: 0 , IOCP: (Занят = 3, Свободен = 997, Мин = 1, Макс = 1000), РАБОЧИЙ: (Занят = 3, Свободен = 2044, Мин = 1, Макс = 2047)

Тайм-аут выполнения GET stock_by_symbol_aapl, inst: 1, mgr: Inactive, err: never, queue: 13, qu: 0, qs: 13, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, IOCP : (Занят = 3, Свободен = 997, Мин = 1, Макс = 1000), РАБОЧИЙ: (Занят = 3, Свободен = 2044, Мин = 1, Макс = 2047)

Тайм-аут выполнения GET portefoliosBotById_ec030000-0001-1200-0000-000000000000, inst: 1, mgr: Inactive, err: never, queue: 13, qu: 0, qs: 13, qc: 0, wr: 0, wq: 0, in : 0, ar: 0, IOCP: (Занят = 3, Свободен = 997, Мин = 1, Макс = 1000), РАБОЧИЙ: (Занят = 3, Свободен = 2044, Мин = 1, Макс = 2047)

Я использую StackExchange.Redis версии 1.1.603 и самый маленький из доступных экземпляров Azure. Я получаю много ошибок времени ожидания GET / SET. У меня нет этой проблемы при локальной работе с сервером Redis на моем компьютере, что заставляет меня полагать, что проблема связана с Azure. Размер информации, хранящейся в Redis, составляет от 2 до 10 КБ.

На портале Azure я вижу количество подключений меньше 20, использование памяти около 130 мегабайт, использование процессора ниже 35% и загрузка сервера Redis всегда ниже 13%. Я не вижу никаких признаков проблемы на портале.

Есть идеи, где я могу получить дополнительную информацию для решения этой проблемы?

Редактировать

Со времени моего первого поста я улучшил несколько настроек.

1) Я перешел с экземпляра C0 на экземпляр Azure Redis C1.

2) Я изменил строку подключения на таймаут 15 секунд. Вот как это выглядит:

boursexxxxxxx.windows.net:6380,password=xxxxxxxx,ssl=True,abortConnect=False,connectRetry=5, connectTimeout = 15000, synctimeout = 15000 "

3) Я создал пул из 10 Lazy Loading ConnectionMultiplex, которые я чередую при каждом вызове.

private static readonly Lazy<ConnectionMultiplexer>[] lazyConnection;

//In the static constructor of my cache :

lock (lockPookRoundRobin)
{
                lazyConnection = new Lazy<ConnectionMultiplexer>[POOL_SIZE];
                var connectionStringCache = System.Configuration.ConfigurationManager.AppSettings["CacheConnectionString"];
                for (int i = 0; i < POOL_SIZE; i++)
                {
                    lazyConnection[i] = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionStringCache));
                }
}

4) Я уменьшил стоимость многих кешей. В зависимости от сериализованного объекта у меня есть:

4.1) 1.25ko (5%)

4.2) 0.154ko (5%)

4.3) 26ko (20%)

4.4) 700ко (здесь нужно работать, но ограничено ‹100 записей)

4.5) 5ko (30%)

4.6) 66ko (40%)


person Patrick Desjardins    schedule 28.07.2016    source источник


Ответы (2)


Похоже, ваши настройки ThreadPool необходимо изменить, как описано здесь .

Вы также можете просмотреть эти статьи, так как они помогут вам узнать об общих проблемах, с которыми люди сталкиваются при использовании Redis:

person JonCole    schedule 01.08.2016
comment
Хороший источник информации. У меня их большинство. Я увеличу размер Azure с базового до стандартного (даже если это очень дорого). Попробую завести пул ConnectionMultiplexer. Я скоро напишу свой результат. - person Patrick Desjardins; 02.08.2016

Для всех, кто читает этот пост. Я сделал несколько вещей:

  • Если вы используете Entity Framework, не забудьте ограничить глубину, которую вы используете во время сериализации.
  • Сжать сериализованную строку.
  • Используйте C1 вместо C0.
  • Добавьте много телеметрии, чтобы узнать частоту настройки и получения из кеша, оптимизировать тяжелый сценарий.
  • Кэшируйте кеш Redis с помощью кеша памяти в IIS. Я сделал что-то очень маленькое, но ослабил давление в случае с тяжелой потребностью в данных.

Находясь в облаке, Redis не на том же сервере, что и веб-сервис, добавляет значительные накладные расходы.

person Patrick Desjardins    schedule 23.08.2016