высокий процессор в IIS

Я разрабатываю POS-приложение, которое имеет локальную базу данных на каждом POS-компьютере и взаимодействует с сервером с помощью WCF, размещенного в IIS. Приложение развернуто у нескольких клиентов уже более года.

Около недели назад мы начали получать отчеты от одного из наших клиентов о том, что сервер, на котором размещен IIS, работает очень медленно. Когда я проверил проблему, я увидел, что пул приложений с моим процессом взлетел почти до 100% процессора на сервере с 8 процессорами.

Я проверил монитор активности SQL и сетевой том, и они не показали существенной перегрузки сверх того, что мы обычно видим.

При проверке потоков в Process Explorer я увидел множество потоков, неоднократно вызывающих CreateApplicationContext. Я попытался установить .Net 2.0 SP1, согласно некоторым сообщениям, которые я нашел в сети, но это не решило проблему и заменило вызовы функций на CLRCreateManagedInstance.

Я собираюсь с помощью adplus и windbg сделать дамп процессов IIS и попытаться выяснить, что не так.

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

p.s. Эта же версия приложения развернута в другом заказчике, и там все работает нормально. Я также пробовал откатывать версии (даже очень старые версии), и он все равно ведет себя точно так же.

Изменить: ну, проблема решена, оказывается, у меня был SQL-запрос, который не ограничивал набор результатов, и когда клиент прошел определенное количество строк, он начал тормозить сервер. У меня ушло два дня, чтобы найти его, из-за всего окружающего шума в логах, но я дождался ночи и тогда сделал дамп, который сразу же показал мне запрос.


person Miki Watts    schedule 30.12.2008    source источник


Ответы (4)


Обычно это не имеет ничего общего с аппаратным обеспечением, а связано с тем, как настроен IIS в сочетании с некоторыми немного длинными запросами (100+ миллисекунд).

В конфигурации вашего пула приложений установите для параметра веб-сада значение около 20 или более.

Настройка веб-сада — это в значительной степени количество потоков, доступных для обработки запросов для вашего приложения. Если установлено значение 1, то один запрос может заблокировать обработку других запросов до завершения.

У меня есть приложение, которое обрабатывает около 3,5 миллионов запросов в день. Когда веб-сад был установлен на 1, ЦП веб-сервера оставался на 100%, и было отброшено МНОГО запросов. Когда я увеличил его до 50, загрузка ЦП веб-сервера упала до чуть менее 2%, и ни один запрос не был отброшен.

person NotMe    schedule 31.12.2008
comment
Остерегайтесь сохранения состояния сеанса. msdn.microsoft.com/en-us/library/aa720391 (VS.71).aspx - person gerleim; 25.02.2009
comment
Мое личное отношение к сессии таково, что это вообще плохая идея. Если вам абсолютно необходимо сохранить некоторую информацию, используйте зашифрованный файл cookie. - person NotMe; 25.02.2009
comment
@ChrisLively: помещать все в файл cookie - не очень хорошая идея. Это делает ваш сайт уязвимым для враждебных данных/кода, внедряемых через них. - person Krisztián Balla; 29.03.2013

У нас была такая же проблема. Использование ЦП некоторыми процессами пула приложений IIS было настолько высоким, что использование ЦП на веб-сервере составляло около 100%.

Сначала мы использовали DebugDiag и ProcMon, чтобы сузить круг проблем. См. здесь: http://www.iis.net/learn/troubleshoot/performance-issues/troubleshooting-high-cpu-in-an-iis-7x-application-pool

При анализе DebugDiag мы обнаружили много сообщений «Этот поток ожидает в WaitOne». Это указывало на то, что запросы по какой-то причине ждут друг друга. Итак, мы начали искать общие ресурсы. Единственное, что мы действительно смогли найти, это база данных. Итак, мы решили, что, несмотря на то, что веб-сервер использует 100% ЦП, реальной проблемой должен быть сервер базы данных.

Мой коллега продолжил расследование этого дела. Он сделал следующие вещи:

1.) Настроить параллелизм SQL Server

Используя ProcMon на сервере базы данных, он обнаружил, что SQL Server использует слишком много блокировок и защелок. Взгляните сюда: http://blog.sqlauthority.com/2011/02/06/sql-server-cxpacket-parallelism-usual-solution-wait-type-day-6-of-28/

Он установил количество используемых процессоров на запрос равным 4. Значением по умолчанию было 0 (что, я подозреваю, равно количеству доступных процессоров — 24 в нашем случае). Вы можете установить это с помощью SQL Management Studio, щелкнув правой кнопкой мыши на самом узле сервера и выбрав свойства.

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

2.) Создание новых и отсутствующих индексов в базе данных

На нашем сайте использовалось стороннее программное обеспечение для форумов, которое, как оказалось, вообще не использовало никаких индексов в своей базе данных. Мой коллега использовал знания отсюда: http://www.mssqltips.com/sqlservertip/1634/using-sql-server-dmvs-to-identify-missing-indexes/, чтобы создать несколько новых индексов.

Теперь дело вроде бы улажено.

person Krisztián Balla    schedule 03.04.2013

Если исходить исключительно из интуиции и сделать полное предположение, похоже, что может произойти какое-то исключение, исключение перехватывается глобальным обработчиком исключений в global.asax, и обработчик исключений также вызывает создание исключения и сброс процесс. Это также может быть связано с тем, что утилита сканирования на вирусы блокирует некоторые файлы. Хотя я могу НАМНОГО ошибиться.

person Community    schedule 30.12.2008
comment
У меня еще не было времени проверить это, но каково будет поведение чего-то подобного? - person Miki Watts; 31.12.2008

Не исключайте возможность аппаратной проблемы. У меня был сервер, работающий медленно, и я обнаружил, что это проблема с материнской платой. Его заменили по гарантии.

person Community    schedule 30.12.2008
comment
как бы я диагностировал что-то вроде этого? - person Miki Watts; 31.12.2008