ASP.NET MVC2 в веб-ферме - медленная загрузка страниц с большим трафиком - PullRequest
2 голосов
/ 04 октября 2011

У нас есть веб-приложение, написанное на MVC2 + Linq2SQL + MS SQL SERVER 2008, размещенное на веб-ферме. Почти как stackoverflow.com

У нас 4 сервера IIS7 + 1 SQL SERVER 2008, сбалансированных с MS NLB

Статический контент кешируется внешним провайдером кэша - Akamai, что сокращает 86% запросов.

Каждый веб-сервер имеет 32 ГБ ОЗУ и 4 четырехъядерных процессора, поэтому на внешнем интерфейсе 64 ядра.

Сохраняем состояние сеанса в таблицах.

Он отлично работает со средним трафиком (загрузка страницы = 0,2 с), но компания делает рекламные ролики, и во время этих объявлений трафик достигает 20 000 пользователей в течение 20-30 секунд.

В этот момент страница замедляется до 8 - 10 секунд. Однако использование ЦП и памяти даже не достигает 40% на любой машине.

Пропускная способность центра обработки данных не достигает половины его пределов.

Медленные страницы генерируют данные из простых SELECT максимум из 10 записей только из 1-2 таблиц.

Очевидно, что где-то есть узкое место и он пытается выяснить, где.

Кто-нибудь может дать мне совет, где искать проблему?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Я нашел проблему некоторое время назад, но у меня не было времени опубликовать ее здесь. Я перепробовал почти все, что мог придумать: индексы, оптимизацию sql, мониторинг дискового ввода-вывода, пересмотр кода. Ничто из перечисленного не решило мою проблему. Я запускаю веб-стресс-тест с 2 рабочих станций на нашей локальной сети, и я могу заморозить всю страницу за считанные секунды! Во время тестирования я заметил нечто странное. Я создал отдельный контроллер для тестирования и поставил 2 метода. Оба делают одно и то же: запрашивают одни и те же данные на нашем сервере баз данных.

Действие А)

public ActionResult Index(){
var model = new SomeModel();
// Get data
....
return View(model);
}

Действие B)

public ActionResult Index() {
 var model = new SomeModel();
// Get data
....
return View("Index",model);
}

Разница в загрузке страницы:

А) ~ 297 мс

B) ~ 39,47 с

Это происходит только во время высокого параллелизма, в противном случае все в порядке. Похоже, что поиск в представлении по умолчанию в библиотеке MVC2 вызывает проблему, поскольку, как только он указан, все отлично работает.

Я описал это в своем блоге:

http://arturito.net/2011/10/24/asp-net-mvc2-in-the-web-farm-slow-page-load-with-high-traffic-where-is-the-bottleneck/

Я разместил его в системе отслеживания проблем asp.net на codeplex, но никто еще не прокомментировал / не ответил на него.

http://aspnet.codeplex.com/workitem/9396

0 голосов
/ 04 октября 2011

Для получения небольшого выигрыша в производительности вы можете попробовать некоторые из настроек, которые Rico Mariani упоминает в http://blogs.msdn.com/b/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx. В частности, попробуйте использовать CompiledQuery и отключить отслеживание изменений для объектов, отображаемых только на экране.

...