ЦП достигает 100% при 200 запросах в секунду в iis 8.5

Приложение размещено в IIS 8.5 на выделенном сервере с конфигурацией: два процессора xeon E5 2620 v2, 64 ГБ оперативной памяти, 1 ТБ на жестком диске.

Серверная технология: веб-API 2, Angular js, Entity framework 6.0, SQL server 2014. Клиентская сторона: веб-браузер с angularjs и мобильное приложение Android, которое вызывает метод веб-API с помощью HTTP-запроса. strong> Дополнительные инструменты: Autofac 3.5, Automapper, newtonsoft json, после ссылки на какой-то пост мы удалили automapper из метода непрерывного вызова.

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

debugdiag, поток использовал максимальный ЦП.

согласно бережливому часовому, это дает результат

но все еще не идентифицирует проблему,

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

согласно запросу пользователя, для каждого пользователя он будет получать 2 запроса в секунду и одну операцию ввода, которая не основана на продолжении. может быть его в минуту или больше.

после запуска 100 пользователей над операцией загрузка процессора составляет от 99% до 100%, а когда количество пользователей увеличивается, приложение становится медленным, когда присутствует 100 пользователей, один запрос выполняется примерно за 500 мс до 800 мс. после того, как там будет 200 пользователей, он завершится за от 2 до 4 секунд и будет становиться все медленнее и медленнее.

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

Согласно некоторым экспертным советам, некоторые запросы могут быть заблокированы в EF или iis. но как и почему. там весь код как обычно.

Я надеюсь, что получу решение как можно скорее, теперь это проблема для меня.

Заранее спасибо.


person Sanjay    schedule 30.03.2016    source источник
comment
Вы получили решение для этого?   -  person Jose Francis    schedule 25.11.2016


Ответы (2)


У вас так много инструментов, которые постоянно отслеживают ваш сервер, влияя на пропускную способность. Попробуйте удалить их из производственной среды. В идеале такие инструменты не рекомендуется использовать в реальной среде, но вы можете установить их в тестовых средах.

Также укажите, как вы тестируете 100 или 200 запросов? Какие инструменты вы используете для отправки 100-200 запросов?

person Atul K    schedule 30.03.2016
comment
Я не использую никаких инструментов для запроса 200, есть живые клиенты, которые его используют, и я просто получаю информацию об онлайн-клиентах. - person Sanjay; 30.03.2016

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

Для упомянутого стека наиболее очевидной проблемой обычно является использование ORM без учета базовой базы данных. Ленивая загрузка, проблема SELECT N+1 и так далее по классическому списку. Лучший способ решить подобные проблемы — использовать некоторые инструменты профилирования. Начните с SQL Server Profiler и посмотрите, сколько у вас запросов к базе данных. Вы можете использовать EFProf, чтобы узнать, не слишком ли много запросов к базе данных за сеанс. должен иметь только один или два, независимо от того, сколько элементов возвращает ваш вызов API. Если вы в конечном итоге обнаружите, что количество вызовов базы данных в одном сеансе коррелирует с количеством элементов, возвращаемых вызовом API, у вас есть ВЫБРАТЬ N+1.

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

Как вы можете понять из моего ответа, я подозреваю, что проблема в базе данных. Однако не попадайтесь в ловушку «давайте изменим базу данных», поскольку, хотя я не большой поклонник SQL Server, я знаю, что эта база данных способна делать многое и делать это быстро. Сотня пользователей — забавная нагрузка для запуска SQL Server. Так что, скорее всего, ваш код работает с ней, и это будет точно так же с любой другой базой данных, если вы не начнете смотреть на свой собственный код и перестанете обвинять свой стек.

Вы также можете попробовать изолировать проблему, разделив веб-сервер и SQL Server на два разных компьютера.

person Alexey Zimarev    schedule 31.03.2016