none
Проблема загрузки CPU на 100% при работе веб-сервиса RRS feed

  • Вопрос

  • Имеется следующая проблема.

    Создан веб-сервис по генерации отчетов в формате html и в различных офисных форматов (docx, pptx,  xlsx) с помощью OpenXML SDK 2.0. При одновременной работе нескольких десятков пользователей, генерящих относительно большие отчеты более 100 страниц происходит загрузка процессора на 100 процентов(процессами w3wp.exe). Веб-сервис работает с  Web Garden >1 c использование сервера состояний ASP.NET State Server (без них результаты были еще хуже). Отчеты строятся в потоках и с контролем текущего состояния построения отчета со страницы юзера(ajax). 

    Вопрос 1. Есть какие-нить мнения по поводу того, как сократить загрузку процессора, например даже в ущерб времени построения отчетов. Так как в текущий момент основной портал и веб-сервис будет находятся на одном физическом сервере (в разных пулах приложений). Интересуют как административно настроечные решения для IIS, так и возможные изменения в коде. В идеале хотелось бы получить например загрузку в 50-60% для работающего веб-сервиса.

    Вопрос 2. При нагрузочном тестировании получается следующее. Например паралельно запускаются на  построение 50 большие отчетов(больше 100 слайдов например) и среднее время построение каждого пусть будет 5 минут(из за одновременной нагрузки) и в то же время отправляют строится мелкие отчеты по 1-5 страниц, которые при одиночном построение были бы готовы за секунды. А получаем, что из-за очередей на процессорное время они выдаются пользователю тоже только через 5 минут. Причем если одновременно генерятся сотни ТОЛЬКО мелких отчетов, то они возвращаются в приемлимое время. Нагрузка процессора при этом тоже 100%.

    Есть какие-нить мнения как решить данную проблему?.

    Вариант разнесения по различным физическим серверам веб-сервисов с созданием промежуточного уровня для предварительного анализа примерного времени построения каждого отчета сделать можно, но пока ищу другие варианты.

    9 февраля 2011 г. 18:38

Ответы

  • Выделите сервис по отчетам в отдельное приложение,

    настройте в IIS CPU trottling, пример  см. limit и Configures the maximum percentage of CPU time 

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

    одному скармливайте большие, другому малые, тротлинг для каждого свой

    приложению для больших отчетов - давать меньше ресурсов, чем приложению для малых

     

    • Помечено в качестве ответа O. Zh 10 февраля 2011 г. 17:15
    10 февраля 2011 г. 0:31
  • То Nikonorov Evgeniy.

    Спасибо за ссылку.

    Если я не ошибаюь limit и Configures the maximum percentage of CPU time  ничего не дают фактически. Там только указывается при каком значении нагрузки CPU будет выполняться Action : один из двух KillW3wp(убивается процесс) или NoAction(доблестно записывает сей факт в журнал). Ни то ни другое не выход в данном случае.

    А вот что можно попробывать так это набор параметров

    smpAffinitized и smpProcessorAffinityMask. Указал для отдельного пула приложения вебсервиса что он работает только на двух процессорах из 4-х и получил соответсвенно нагрузку общую 50%. Два процессора пашут на 100% и еще два прохлаждаются. Больше тут аппаратно вряд ли что решишь, остальные варианты только связанны с масштабированием веб-сервисов

    • Помечено в качестве ответа O. Zh 10 февраля 2011 г. 17:15
    10 февраля 2011 г. 14:28

Все ответы

  • Выделите сервис по отчетам в отдельное приложение,

    настройте в IIS CPU trottling, пример  см. limit и Configures the maximum percentage of CPU time 

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

    одному скармливайте большие, другому малые, тротлинг для каждого свой

    приложению для больших отчетов - давать меньше ресурсов, чем приложению для малых

     

    • Помечено в качестве ответа O. Zh 10 февраля 2011 г. 17:15
    10 февраля 2011 г. 0:31
  • То Nikonorov Evgeniy.

    Спасибо за ссылку.

    Если я не ошибаюь limit и Configures the maximum percentage of CPU time  ничего не дают фактически. Там только указывается при каком значении нагрузки CPU будет выполняться Action : один из двух KillW3wp(убивается процесс) или NoAction(доблестно записывает сей факт в журнал). Ни то ни другое не выход в данном случае.

    А вот что можно попробывать так это набор параметров

    smpAffinitized и smpProcessorAffinityMask. Указал для отдельного пула приложения вебсервиса что он работает только на двух процессорах из 4-х и получил соответсвенно нагрузку общую 50%. Два процессора пашут на 100% и еще два прохлаждаются. Больше тут аппаратно вряд ли что решишь, остальные варианты только связанны с масштабированием веб-сервисов

    • Помечено в качестве ответа O. Zh 10 февраля 2011 г. 17:15
    10 февраля 2011 г. 14:28