Как использовать время простоя процессора в пуле приложений IIS?

У меня есть веб-сайт C#/ASP.NET на основе IIS 6.0 с серверной частью SQL. Я хочу генерировать некоторые отчеты с большими вычислительными затратами (сводки, индексы поисковых систем и т. д.) во время простоя процессора. Мне нужно, чтобы отчеты генерировались ВНУТРИ пула приложений IIS, чтобы он знал правильные параметры конфигурации и (что труднее исправить) избегал кошмарных ограничений безопасности, на которые я был наложен.

Могу ли я запускать потоки внутри процесса AppPool, которые не будут загружать ЦП, чтобы он мог продолжать беспрепятственно обслуживать запросы? Если да, то как? Какой код и библиотеки?

Я предполагаю, что это включает в себя ThreadPool и приоритеты потоков, но я не смог найти хорошего охвата потоков с низким приоритетом и их взаимодействия с веб-сервером IIS и пулом приложений.

[EDIT] http://msdn.microsoft.com/en-us/magazine/cc163854.aspx#S7 обсуждается использование для этого таймера, но прямо не говорится, что платформа .NET гарантирует, что поток таймера имеет низкий приоритет. Это может быть решением, но гарантировано ли это?

[EDIT] Этот парень рассказывает о важных проблемах, связанных с исключениями: http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx

[EDIT] Интересно, что сам Stack Overflow, похоже, использует фоновые потоки IIS для моей цели: https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/... в комментариях все говорят, что их (больше не используется) метод отстой, но этот в комментариях мне понятен...


person Scott Stafford    schedule 13.07.2010    source источник
comment
Я не думаю, что это лучшая идея запускать длинный код внутри IIS - не потому, что он не будет работать, а потому, что если вы превысите пороговые значения памяти или ЦП, IIS может просто перезапустить ваш процесс, и вам нужно будет сделайте свой код устойчивым к этому — например, сохраните состояние и восстановите его после резервного копирования нового рабочего. Взгляните на HostingEnvironment.IRegisteredObject и здесь hyperthink.net/blog/recycling-appdomains- not-cans И если у вас нет запросов, IIS может закрыть процесс.   -  person    schedule 13.07.2010
comment
@ToxicAvenger: Определенно. Автоперезапуск IIS — это ловушка, которую я должен избегать. В этой ситуации я не думаю, что у меня есть выбор, кроме как запустить его внутри IIS благодаря политике безопасности, находящейся вне моего контроля.   -  person Scott Stafford    schedule 13.07.2010
comment
Я должен высказать эту простую, но невысказанную идею, а как насчет того, чтобы получить отдельный сервер для этой обработки? Аппаратное обеспечение обычно имеет очень низкую совокупную стоимость владения.   -  person Chris Marisic    schedule 14.07.2010
comment
На самом деле Word Automation Services (часть SharePoint 2010 для преобразования документов, например Word docx -> PDF) находится внутри службы WCF, размещенной в IIS, НО запускает .exe для фактического преобразования. Служба связи IIS ‹-› .exe — это WCF.   -  person    schedule 14.07.2010
comment
@ToxicAvenger: Это интересная идея. Это позволит избежать перезапуска IIS в середине процесса, а также даст вам необходимые разрешения и конфигурацию, а также возможность запуска процесса с низким приоритетом?   -  person Scott Stafford    schedule 14.07.2010


Ответы (3)


Вместо того, чтобы опрашивать пул приложений на предмет низкого использования процессора, почему бы не ПРЕДПОЛОЖИТЬ, что использование будет низким, когда система находится под наименьшей нагрузкой (в нерабочее время и т. д.). Тогда вы можете просто запланировать создание отчетов в течение этого окна и не беспокоиться о загрузке ЦП, нагружающей систему.

person Achilles    schedule 13.07.2010
comment
Я тоже намереваюсь сделать это, но а) некоторые отчеты лучше всего генерировать, как только это будет разумно возможно, и б) если я могу использовать время простоя, я мог бы использовать это для стиля Geni.com, я сообщу вам, как только это будет генерация отчета в готовом виде. - person Scott Stafford; 13.07.2010
comment
Я не уверен, что вы можете сделать это ... желать отчетов в стиле XXXX.com - это хорошо, но не зная их подхода, как вы можете добиться этого, когда вы знаете, что на вас наложены ограничения? И, учитывая резкий характер использования процессора при недогрузке приложения, я не думаю, что будут достаточно большие окна, чтобы не снижать производительность сайтов при создании отчетов. - person Achilles; 13.07.2010
comment
Еще более важной причиной против этого является то, что пулы приложений IIS часто завершают работу после некоторого простоя, поэтому их не будет рядом, чтобы проснуться! - person Scott Stafford; 02.09.2010

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

person Mitchel Sellers    schedule 13.07.2010

Насколько я могу судить, на удивление, хорошего ответа нет. Лучший ответ, который я могу придумать, - запустить фоновые потоки в IIS и иметь отдельный запросчик опроса, время от времени проверяющий сервер, чтобы убедиться, что он не спит. Если кто-то придумает лучший ответ, чем этот, я переназначу галочку...

person Scott Stafford    schedule 29.10.2010