【问题标题】:How do I exploit idle CPU time in an IIS App Pool?如何利用 IIS 应用程序池中的空闲 CPU 时间?
【发布时间】:2011-03-15 11:59:21
【问题描述】:

我有一个带有 SQL 服务器后端的基于 IIS 6.0 的 C#/ASP.NET 网站。我想在空闲 CPU 时间生成一些计算量大的报告(摘要、搜索引擎索引等)。我需要从 IIS 应用程序池中生成报告,以便它知道正确的配置设置并(更难修复)避免我被置于噩梦般的安全限制之下。

我能否在 AppPool 的进程中启动不会占用 CPU 的线程,以便它可以继续不受限制地处理请求?如果是这样,怎么做?什么代码和库?

我想它涉及 ThreadPool 和线程优先级,但我找不到低优先级线程及其与 IIS Web 服务器和应用程序池交互的良好覆盖范围。

[编辑]http://msdn.microsoft.com/en-us/magazine/cc163854.aspx#S7 讨论为此使用 Timer,但没有直接说明 .NET 框架将确保 Timer 线程是低优先级的。这可能是一个解决方案,但有保证吗?

[编辑] 这个人谈论与异常相关的重要问题:http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx

[编辑] 有趣的是,Stack Overflow 本身似乎使用 IIS 后台线程来达到我的目的:https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/..。在 cmets 中,每个人都说他们(不再使用)的技术很烂,但是 cmets 中的 this one 对我来说很有意义......

【问题讨论】:

  • 我不认为在 IIS 中运行长时间运行的代码是最好的想法 - 不是因为它不起作用,而是因为如果您超过内存或 CPU 阈值,IIS 可能只是回收您的流程,并且您需要使您的代码具有弹性 - 例如,保存状态并在新工作人员备份后恢复它。看看 HostingEnvironment.IRegisteredObject 和这里 hyperthink.net/blog/recycling-appdomains-not-cans 如果你没有任何请求,IIS 可能会关闭进程。
  • @ToxicAvenger:当然。 IIS 自动回收是我必须避免的一个陷阱。在这种情况下,由于安全策略超出了我的控制范围,我认为除了在 IIS 中运行它之外别无选择。
  • 我不得不把这个简单但不言而喻的想法扔出去,让一个单独的服务器来做这个处理怎么样?硬件通常具有非常低的 TCO。
  • 实际上,Word Automation Services(用于文档转换的 SharePoint 2010 的一部分,例如 Word docx -> PDF)位于 IIS 托管的 WCF 服务中,但会启动一个 .exe 来进行实际转换。通信 IIS 服务 .exe 是 WCF。
  • @ToxicAvenger:这是一个有趣的想法。这可能会避免 IIS 在进程中回收,还可以为您提供所需的权限和配置,以及能够启动低优先级进程?

标签: c# asp.net iis iis-6 threadpool


【解决方案1】:

据我所知,令人惊讶的是,没有好的答案。我能想出的最佳答案是在 IIS 中运行后台线程,并有一个单独的轮询请求程序偶尔 ping 服务器以确保它处于唤醒状态。如果有人提出比这更好的答案,我会重新分配复选标记...

【讨论】:

    【解决方案2】:

    与其轮询应用程序池以获取低 cpu 使用率,不如假设系统处于最轻负载(下班后等)时使用率会低,然后您可以简单地安排在该窗口期间报告并且不用担心 CPU 使用会给系统带来压力。

    【讨论】:

    • 我也打算这样做,但是 a) 最好尽快生成一些报告,b) 如果我可以利用空闲时间,我可以将其用于 Geni.com 风格的“准备好后我会告诉你”类型报告生成。
    • 我不相信你能做到这一点......想要 XXXX.com 风格的报告很好,但不知道他们的方法,当你知道强加给你的限制时,你怎么能实现它?鉴于应用程序欠载中 CPU 利用率的“尖峰”性质,我认为在创建报告时不会有足够大的窗口来不拖累网站性能。
    • 反对这种情况的一个更重要的原因是 IIS 应用程序池通常会在闲置一段时间后自行终止,因此它们不会被唤醒!
    【解决方案3】:

    您可以启动一个线程,然后在后台运行它。这将赋予它比常规 UI 线程更低的优先级。

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2010-12-08
      • 1970-01-01
      • 2014-05-05
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2013-04-04
      相关资源
      最近更新 更多