如何利用IIS应用程序池中的空闲CPU时间?

4
我有一个基于IIS 6.0的C#/ASP.NET网站,使用SQL Server后端。我想在空闲CPU时间内生成一些计算密集型报告(摘要、搜索引擎索引等)。我需要从IIS App Pool内部生成报告,以便它知道正确的配置设置并避免(更难解决的)噩梦般的安全限制。
我可以在AppPool的进程内启动不会占用CPU的线程,以便它可以继续无阻碍地处理请求吗?如果可以,怎么做?需要哪些代码和库?
我想这涉及到ThreadPool和线程优先级,但我找不到关于低优先级线程及其与IIS Web服务器和App Pool的交互的详细介绍。
[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/..。在评论中,每个人都说他们(不再使用的)技术很烂,但这个评论对我来说是有道理的...

2
我认为在IIS内运行长时间运行的代码并不是最好的想法,这不是因为它不能工作,而是因为如果您超过了内存或CPU阈值,IIS可能会重新启动您的进程,您需要使您的代码对此具有弹性 - 例如,保存状态并在新的工作进程恢复后再次运行。请查看HostingEnvironment.IRegisteredObject和此处http://hyperthink.net/blog/recycling-appdomains-not-cans/。如果没有任何请求,IIS可能会关闭该进程。 - ToxicAvenger
@ToxicAvenger:当然。IIS自动回收是我必须避免的陷阱。在这种情况下,由于超出我的控制范围的安全策略,我认为除了在IIS内运行它之外别无选择。 - Scott Stafford
我必须提出这个简单但未被说出的想法,那就是考虑使用一个独立的服务器来进行处理?硬件通常具有非常低的总拥有成本。 - Chris Marisic
实际上,Word Automation Services(SharePoint 2010的一部分,用于文档转换,例如Word docx -> PDF)位于托管在IIS中的WCF服务内,但启动一个.exe来执行实际的转换。 IIS服务<->.exe之间的通信是WCF。 - ToxicAvenger
@ToxicAvenger:这是一个有趣的想法。这可能会避免IIS在进程中间重启,并且为您提供所需的权限和配置,同时能够启动低优先级进程? - Scott Stafford
3个回答

3

不要轮询应用程序池以获取低CPU使用率,为什么不假定系统在最轻负载(如业务小时后等)下使用率会很低呢?然后您可以在该窗口期间安排报告,而不必担心CPU使用率会使系统过度紧张。


我也打算这样做,但是a) 有些报告最好尽快生成,b) 如果我可以利用空闲时间,我可以用它来生成类似Geni.com的“一旦准备好就会立即通知您”的报告。 - Scott Stafford
我并不相信你能做到这一点...想要类似XXXX.com的报告是可以的,但是如果你不知道他们的方法,当你面临已知的限制时,你如何实现它呢?而且,由于应用程序在负载下的CPU利用率具有“尖峰”性质,我认为在创建报告时不会有足够大的窗口来避免拖慢网站的性能。 - Achilles
更重要的原因是,IIS应用程序池经常在闲置一段时间后自行终止,因此它们无法唤醒自己! - Scott Stafford

2

你可以启动一个线程,并在后台运行。这将使它比常规 UI 线程的优先级低一些。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接