Рабочий процесс ASP.Net IIS (w3wp.exe * 32), использующий 100 ресурсов ЦП в производственной среде

Недавно мы развернули новую версию нашего веб-приложения в производственной среде с некоторыми существенными изменениями на странице с относительно высоким трафиком, на которой загружаются различные ипотечные продукты. С момента развертывания страница с этим продуктом увеличилась с 7 до 10 секунд до 50 секунд до 2 минут для загрузки. Кроме того, загрузка ЦП теперь часто максимальна из-за того, что наш рабочий процесс IIS (w3wp.exe 32) работает на нашем выделенном производственном веб-сервере. Эта неприемлемо резкая потеря производительности происходит только на странице продукта, а не на каких-либо других страницах.

Я запускал DebugDiag.exe на сервере в течение длительного периода максимальной загрузки ЦП. Виновником снова была наша страница продукта. У нас в среднем 60 пользователей в обычные рабочие часы, а в часы пик максимально загруженный ЦП значительно замедляет загрузку остальной части страницы веб-приложения. Время от времени мы получаем код ошибки http 501, который указывает на перегрузку сервера и сбои запросов.

Я запустил Chrome Dev Tools> Network> Capture и увидел, что (например) один запрос на получение только самой страницы продуктов (248k) занимает 24 секунды, затем несколько последующих запросов для пары изображений по 20kb и файлов JavaScript занимают еще больше времени ( От 24 до 50 секунд каждый) для общего времени загрузки страницы 1,9 минуты (передано 850 КБ, всего 93 запроса, DOMContentLoaded = 1,2 минуты).

Я не думаю, что такое существенное снижение производительности связано с неэффективными изменениями кода asp.net или SQL, присущими этому новому выпуску (не беспокойтесь о том, что я пытаюсь прикрыть себя; в любом случае это был не мой код ;-)). Следуя этой теории, я заметил, что после того, как основная часть содержимого страницы продукта загружается в браузер, Chrome отправляет еще один запрос на получение (http://ourcompany.com/ productpage.aspx? ImageControl_ctl00 $ ctl00 $ cphMainBodyFrame $ ImageCompanyLogo = 1) для логотипа компании 12k, который был размещен на главной странице asp.net ImageControl. На выполнение этого запроса потребуется в среднем дополнительно 40 секунд. Таким образом, логотип не будет отображаться до конца игры.

Я запустил инструмент профилирования Telerik JustTrace asp.net в моей локальной среде DEV на странице продукта, которая, несмотря на многочисленные обращения к уровням базы данных и доступа к данным, не обнаружила ничего очевидного с точки зрения узких мест в производительности. Затем я вставил указанный выше URL-адрес логотипа в адрес при профилировании в JustTrace и увидел, что для получения этого логотипа выполняется минимальная обработка. Asp.net внутренне вызывает только две хранимые процедуры в базе данных членства для аутентификации пользователя, а также некоторые другие второстепенные системные вызовы. Несмотря на минимальный asp.net и сохраненный файл proc. звонки, запрос логотипа занимает слишком много времени; и только для страницы продукта.

Может ли это быть проблема с блокировкой сеанса? Кроме того, я прочитал тысячи сообщений SO за эти годы, и это мой первый пост. Спасибо сообществу SO за вашу поддержку на протяжении многих лет. Это бесценный ресурс.

Win Server 2008 R2 (v6.1, сборка 7601: SP1) - [виртуальная машина с 8 ядрами ЦП> 32 ГБ ОЗУ] IIS (7.5.7600.16385) ASP.NET 4.0 WebForms MSSQL Server 12


person Perdiddy    schedule 06.04.2016    source источник
comment
Когда ваш сервер полностью использует ЦП для обработки страницы productpage.aspx, очевидно, что любой другой запрос к тому же серверу также пострадает. Итак, я бы вернулся к исходной точке и проанализировал наиболее очевидное подозреваемое: единственное, что изменилось между относительно быстрым сайтом и неработоспособным медленным: страница продуктов.   -  person CodeCaster    schedule 06.04.2016
comment
Другие разработчики переделывали страницу продукта. Однако другие страницы в приложении, отправляющие запросы одновременно со страницей «Продукты», работают быстро, если только ЦП не загружен на длительное время. Также озадачивает (как в OP) просто запрос логотипа (только страница продукта) ex. (... productpage.aspx? ImageControl_ctl00 $ ctl00 $ cphMainBodyFrame $ ImageCompanyLogo = 1) путем вставки над ссылкой в ​​адресной строке занимает в среднем 45 секунд. Только внутренние вызовы asp.net вызывают огонь во время этого запроса, включая, я думаю, блокировку сеанса asp.net. Запросы на 20k файлов .js тоже сканируются   -  person Perdiddy    schedule 06.04.2016


Ответы (1)


Краткий ответ:

Мы использовали элементы управления Infragistics asp.net версии 12.2.20122.2031, которые работают в устаревших браузерах. Обновление до версии 12.2.20122.2257 (также поддерживает устаревшие браузеры) не только полностью решило проблему для страницы наших продуктов, но и оказало решительное влияние на производительность всего сайта.

Длинный ответ:

В течение длительного периода времени, когда ЦП веб-серверов были загружены до максимума, я смог получить снимок запущенных процессов. Я использовал инструмент (DebugDiag) для анализа снимка, и он сгенерировал подробный подробный отчет, в котором функция Infragistics GetLicense () показала, что требует наибольшего количества ресурсов ЦП. Выглядело это примерно так: http://i.stack.imgur.com/6BRAS.png

Я связался со службой поддержки Infragistics по этому поводу, и они направили нас к элементам управления версии 12.x.2257, которые, по их словам, решат проблему с производительностью. Мы обновили DLL Infragistics в нашей среде DEV, и весь наш сайт перешел с 6-15 секунд на загрузку страницы до 2-3 секунд. Асинхронные пост-бэки панели обновлений также выполнялись значительно быстрее.

Мы были обеспокоены любым риском, связанным с проблемами, которые могут возникнуть в результате обновления набора элементов управления, который мы постоянно используем во всем приложении. Тестирование обновления выявило незначительные проблемы с IE DocMode = IE7 при вводе даты вручную в элементе управления календарем Infragistics, если наш код C # динамически создавал элемент управления в исходном коде.

Почему мы используем DocMode IE7

Наше веб-приложение было создано во времена славы IE7. Компания быстро росла, и многие разработчики, которые с тех пор приходили и уходили, приходилось писать много кода. Решение отказаться от зависимости от IE7 никогда не было, поэтому основная часть приложения работает под IE DocMode = IE7. Это означает, что с нашим сайтом совместимы только устаревшие элементы управления Infragistics asp.net (версия ‹= 12.x). Все, что выше версии 12.x, мы испытываем проблемы с отображением с помощью элемента управления календарем.

В заключении; Если этот сценарий кажется вам знакомым, обновите элементы управления и убедите руководство любой ценой отказаться от зависимостей IE7.

person Perdiddy    schedule 17.05.2016