Enyim Memcached провайдер процессор всплеск - PullRequest
3 голосов
/ 15 июля 2009

Я реализовал кеширующий интерфейс и заменил провайдера для нашего сайта, используя enyim. Отлично работает в тестировании, пока мы не приступим к нагрузочному тестированию, при котором процессор w3wp.exe поднимается почти до 100%. У нас есть свойство конфигурации, позволяющее переключать провайдера кэширования обратно на API-интерфейс dotnet, и ЦП возвращается к 5-7%. Кто-нибудь испытывал подобное?

Ответы [ 2 ]

4 голосов
/ 12 августа 2009

Каждый раз, когда вы сохраняете что-либо в memcached через enyim, среда выполнения .NET будет выполнять двоичную сериализацию хранимого объекта. И десериализация при получении. Для некоторых типов (string, byte [] и некоторых других) enyim реализует более конкретную и легковесную сериализацию, но большинство типов сериализуется стандартным BinaryFormatter. Это процессор интенсивно.

Особенно больно, когда ваш код записывается в кэш-память в ASP.NET. Вы, вероятно, будете иметь код, который думает, что получить что-то из кэша бесплатно. Вы можете получить его из кэша снова и снова и снова. У нас были сопоставимые проблемы, когда мы переключились на memcached. Если вы выполните какое-либо профилирование, вы, вероятно, обнаружите, что вы делаете безумно много операций чтения из кэша.

Наш опыт работы с клиентом enyim был очень позитивным. Мы запускаем memcached в ферме серверов ASP.NET на 10 узлах, и это очень стабильно. Для некоторых форм данных (к которым часто обращаются) мы предпочитаем кэширование ASP.NET в памяти в процессе.

0 голосов
/ 11 мая 2011

Обязательно проверьте код сериализации и десериализации на предмет правильного удаления объекта или потока.

У меня был точно такой же файл w3p.exe, который подхватывал 99% симптомов, и я точно думал, что это ошибка драйвера Enyim / Membase, но это не так. Это было наше, и это было потому, что мы забыли Dispose () MemoryStream после десериализации каждого объекта JSON в нашем вспомогательном классе JSON:

   public static T DeserializeToObject<T>(this string json)
    {
        byte[] byteArray = Encoding.ASCII.GetBytes( json );
        MemoryStream stream = new MemoryStream( byteArray );

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        T returnObject = (T)serializer.ReadObject(stream);
        stream.Close();
        stream.Dispose();  // we forgot this line!
        return returnObject;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...