2013-09-23 2 views
1

У меня есть сайт ASP.NET MVC 4, работающий на двухъядерном процессоре Xeon E7540 с частотой 2 ГГц, 8 ГБ на 64-битном Windows Server 2008 R2 Standard.Почему ASP.NET MVC OutputCache терпит неудачу при тестировании нагрузки, но работает, просто обновляя страницу в браузере?

Пул приложений использует .NET 4.0 с интегрированным управляемым режимом трубопровода.

Я украшена моя функция Index с OutputCaching:

[OutputCache(CacheProfile = "ContentPageController.Index")] 

и нижеследующий доступ

<add name="ContentPageController.Index" duration="60" varyByParam="none" location="Server" /> 

Индексом действия в Web.config подготовлена ​​база данных MS SQL, у меня есть SQL Profiler работает на сервере БД, и я вижу, что если я обновляю одну и ту же страницу из браузера в течение 60 секунд, база данных будет удалена только один раз, что указывает на то, что OutputCache запущен.

Однако, когда я загружаю тестовый сайт, создающий лихорадку 1-50 пользователей в течение 60 секунд (граф прикреплен), OutputCache не работает почти сразу после запуска теста, я могу видеть в SQL Profiler запросы, попадающие в базу данных в то время как я ожидал, что только первый запрос ударит по базе данных.

Примерно за 15 секунд до тестирования процессор Web-сервера начал колебаться от 85% до 100%, , в то время как частная память рабочего процесса не увеличилась, оставаясь ниже отметки 149 МБ, начавшейся с 147 МБ перед тестом.

Я совершенно незнакомый, любая идея, что я должен искать?

Большое спасибо!

blitz.io output showing that server starts timing out as it handles more than 18 concurrent users

+0

Загляните в системный журнал, если ваше веб-приложение действительно переработано или разбито. Возможно, он потребляет больше памяти, чем разрешено (настройки пула приложений). – MichaC

+0

Спасибо @Ela, я проверил и рабочие процессы не перерабатывались и не разбивались. –

ответ

0

Если вы видите несколько DB хитов и хотите, чтобы предотвратить это (например, запустить только один раз и кэш), вы должны синхронизировать доступ данного метода (блокировка потоков).

Это гарантирует, что кэш может использовать только первый запрос, и все последующие запросы могут использовать кеш.

псевдо-код:

if(!cache) 
    lock start 
     if(cache)return cache; // this will be hit when the 2nd thread passed the first if... 
     cache = access db... 
    lock end 
return cache; 

Если это не решит ваши проблемы, вы должны исследовать это немного дальше ... Что возвращаемый выход сайта, когда время отклика падать? Кажется, чтобы вернуть ошибку? У вас также есть несколько тайм-аутов ...

Каков код, который попадает в базу?

+0

Спасибо @Ela, но я считаю, что атрибут OutputCache элементов управления MVC работает по-другому, но не результат базы данных, который он кэшируется, а скорее весь объект ActionResult, то, что вы проиллюстрировали, больше похоже на реализацию кэширования с чем-то вроде memcached или radis, это не реализация, которую я принял сам. –

+0

Нет, я говорил о вашей проблеме.Вы сказали, что «я вижу в SQL Profiler запросы, попадающие в базу данных, в то время как я ожидал, что только первый запрос попадет в базу данных» Чтобы предотвратить это, используйте блокировку кеша перед доступом к базе данных ... – MichaC