Медленная AppFabric, высокая загрузка ЦП и памяти

Я внедрил AppFabric 1.1 в свое веб-приложение ASP.NET. Я использую подход Read Through, потому что мне просто нужно прочитать изображения из моей базы данных SQL и сохранить их в кеше. Так что у меня будет шанс получить эти данные как можно быстрее.

Я проверяю оболочку и вижу, что мое приложение успешно читает из кеша и записывает в кеш, если кеш пуст. Однако AppFabric не так быстр, как я ожидал. Версия без AppFabric быстрее версии с AppFabric. В дополнение к этому, когда я использую Appfabric, я вижу высокую загрузку ЦП и памяти.

Каковы возможные причины этого? Что вы предлагаете мне?

С уважением к вашим идеям,


person merimini    schedule 05.08.2014    source источник


Ответы (1)


Так что без подробностей сложно сказать наверняка, но я могу попытаться помочь, опираясь на свой опыт работы с AppFabric. Мы говорим о высоком использовании памяти на сервере AppFabric или на клиентском компьютере (не уверен, используете ли вы веб-приложение или что-то еще)

  1. AppFabric будет медленнее, чем внутрипроцессная память, а также AF не должен находиться на том же сервере, что и ваше приложение.
  2. Как вы создаете AppFabric DataCacheFactory? Вы создаете для каждого запроса? Это плохо, так как это дорого, поэтому он должен быть статичным/синглтоном. я делаю что-то вроде

открытый класс AppFabricDistributedCacheManagerFactory {

private static DataCacheFactory _dataCacheFactory;
    public void Initialize()
    {
        if (_dataCacheFactory == null)
        {
            _dataCacheFactory = new DataCacheFactory();
        }
    }
......
  1. У вас включен локальный кеш в AppFabric, для изображений это кажется подходящим.
  2. Убедитесь, что ваш провайдер не генерирует исключений и вызывает Appfabric только тогда, когда это действительно необходимо. Поместите fiddler на свой ящик разработчика и наблюдайте за запросами. Так что следите за

    1. First call to AF, are you using regions? Make you create it.
    2. Если вы создаете регионы? Вы делаете его существующим, прежде чем сохранить? На всякий случай, если вы посмотрите на этот код.. до этого.. У меня было несколько проблем

      public void SaveToProvider(string key,TimeSpan duration ,string regionName,object toSave)
      try
      {
          Cache.Put(key, toSave, duration , regionName);
      }
      catch (DataCacheException cacheError)
      {
          // Look at the ErrorCode property to see if the Region is missing
          if (cacheError.ErrorCode == DataCacheErrorCode.RegionDoesNotExist)
          {
              // Create the Region and retry the Put call
              Cache.CreateRegion(_regionName);
              Cache.Put(key, toSave, duration , regionName);
          }
      }
      
  3. Следите за запросами, когда вы запрашиваете элемент, который не является кешем.. видите, что это вызов AF, затем загружает изображение и снова вызывает AF для сохранения.

  4. Наблюдайте за запросом, когда вы знаете, что элемент уже загружен, если вы используете локальный кеш, вы не должны видеть запросы AF. Один, если это не так.
person Jon Z    schedule 05.08.2014
comment
Спасибо @jon, это очень подробная информация. В моей бета-версии я использовал AF на том же сервере. Кроме того, я не использовал регионы. Я создал файл провайдера для реализации логики ReadThrough. Вместо Cache.Put() я использую DataCacheItemFactory.GetCacheItem(). Есть ли возможность использовать регионы в этом подходе? - person merimini; 06.08.2014
comment
@meri вам нужно использовать регионы только в том случае, если вы хотите искать по тегу, например, используя GetObjectsByTag() - person stuartd; 07.08.2014
comment
@stuartd Истинные регионы полезны с точки зрения кода для «GetObjectsByTag ()», но они также могут быть полезны для администрирования сервера. Администраторы, которые заботятся о моей фабрике приложений, любят регионы, поэтому они могут более подробно видеть, какие элементы хранятся. -meri Я не уверен на 100%, если вы можете использовать поставщика ReadThrough. Я обычно не использую их, потому что их сложно развернуть. Тем не менее, я сделал очень похожее поведение, написав в своем коде поставщика кеша, который загружается из кеша, но если он пуст, загружает элемент и сохраняет его в кеше. ИМХО, не сложно и лучше разделить проблемы. - person Jon Z; 07.08.2014
comment
@JonZ с использованием регионов также означает, что у вас не может быть кластера кеша высокой доступности. - person stuartd; 07.08.2014
comment
@meri вы можете передавать теги в четвертом параметре в DataCacheItemFactory.GetCacheItem() - person stuartd; 07.08.2014
comment
Я отказался от использования моего провайдера ReadThrough, я пишу его внутри своего кода @JonZ. Спасибо. - person merimini; 08.08.2014
comment
Я не знал подробностей о регионах, я использую их после ваших предложений @stuartd. Спасибо. - person merimini; 08.08.2014
comment
@meri Ты понял, как использовать AF? Я могу округлить свой код, если у вас возникли проблемы. - person Jon Z; 12.08.2014
comment
да, спасибо @JonZ, я написал свой собственный провайдер. Я не знаю почему, но провайдер ReadThrough вел себя так, будто перестраивал себя на каждой итерации, это увеличивало использование ЦП и памяти. - person merimini; 13.08.2014