IIS 7.x应用程序池最佳实践


24

我们将在许多新服务器上部署大量站点。我对应用程序池有以下问题:

  1. 每个网站最好有一个应用程序池。这种方法有什么警告吗?一个应用程序池会占用所有的CPU,内存等吗?

  2. 您何时应在一个应用程序池中允许多个工作进程?什么时候不应该

  3. 可以使用私有内存限制来防止一个应用程序池干扰另一个应用程序池吗?设置得太低会导致有效请求回收应用程序池而没有得到有效响应吗?

  4. 专用和虚拟内存限制之间有什么区别?

  5. 是否有令人信服的理由不每个站点运行一个应用程序池?


您首先要回答的问题是:这些网站(即.htm / .js)还是Web应用程序(即.aspx / .php)?
编码大猩猩,

主要是.Net 3.5应用程序。一个是第三方PHP应用程序。
埃里克·伯查姆

1
这是一个广泛的主题-主题(和@CodingGorilla的答案)很有趣,但它可能不是最适合科幻问答风格的主题
voretaq7 2011年

Answers:


20

1)似乎建议每个网站都有一个应用程序池。这种方法有什么警告吗?例如,一个应用程序池可以占用所有CPU,内存,等等吗?

这是一个很好的方法。我没有充分的理由可以想到让不同的“站点”(应用程序)共享同一个池。除非他们需要共享某种单一资源。理论上,一个应用程序可能占用大量CPU或内存,但是更改应用程序池的方式并不会真正造成太大影响。

2)什么时候应允许一个应用程序池中有多个工作进程。什么时候不应该

最好保留默认设置。除非您真的知道自己在做什么,否则实际上可能会对您的网站/应用程序产生负面影响。

3)可以使用私有内存限制来防止一个应用程序池干扰另一个应用程序池吗?设置得太低会导致有效请求回收应用程序池而没有得到有效响应吗?

a)理论上

b)是,将其设置为较低会产生负面影响。同样,除非您有特定需求,并且知道自己在做什么,否则就别管它们了。

4)专用和虚拟内存限制之间有什么区别?

这很复杂,这是我发现的一条快速帖子,可能对您有所帮助:http : //cybernetnews.com/cybernotes-windows-memory-usage-explained/

5)是否有令人信服的理由不每个站点运行一个应用程序池?

同样,我唯一能想到的原因是,如果多个应用程序需要某种“共享资源”,那么您将希望在同一过程中运行它们。

对于一般用途的应用程序和网站,IIS的默认值设置得很好。

****更新****

关于您要求提供有关#2的其他信息的信息,除非您有特殊需要,否则请勿这样做。即使服务器操作耗时很长,使用多个线程也可以处理请求,并且您仍希望使用“异步请求”来处理长时间运行的任务(这将释放线程池线程来处理其他请求)。实际上,我想不出任何充分的理由允许单个池具有多个进程。

一旦开始讨论多个进程,您可能会遇到以下问题:由于进程1中的会话仍处于活动状态而丢失了会话状态,但请求正在由进程2处理。甚至更糟的是,您必须弄清楚如何处理做一些进程间的交流,这是一个真正的痛苦。

无论您对多重流程的原因有何看法,我都愿意打赌,有一种更好的方法来处理它(而不是启动另一个流程)。


我感谢您的深思熟虑,并接受了它。如果您对#2有更多特定的信息,我们将不胜感激。当然,“最好不要打扰”是明智的建议,但是最好还是知道何时使用多个工作程序。我想当您有一些服务器操作需要很长时间才能返回响应时,例如大报表,接受大帖子的Web服务等,我认为这更有意义。我还假设所有正常的线程并发性东西都适用吗?
埃里克·伯汉

只是要添加:如果您希望应用程序不能很好地协同工作,则IIS的安装对话框会指出,可以安装Windows System Resource Manager并将其用于限制应用程序池的CPU和内存使用。
2011年

@TristanK,谢谢您的提示。那是非常有帮助的。
埃里克·伯汉

@Coding Gorilla-再次感谢您的见解。我决定认真研究“为什么要使用网络花园”,并提出了一些回应。您提到的所有警告都适用,特别是处理对共享资源(如各种缓存和用户会话)的异步访问。网络花园功能本质上仅允许您在单个服务器上负载均衡请求,而在核心服务器上负载更多。因此,除了路由请求之外,您必须处理在负载平衡情况下通常要处理的所有警告。
埃里克·伯汉

@Coding Gorilla-继续...我发现使用多工作进程功能的最佳“理由”是提高性能。查看此链接:iis-aid.com/articles/performance_testing/…。当然,您最好了解我们经常忽略与网站一起考虑的所有异步编程方面的工作,因为它们中的大多数(至少从一开始)都运行单个工作线程。因此,我的问题的简短答案是:如果遇到性能问题,请尝试一下。
埃里克·伯卡姆

4

我总是为网站配置专用的应用程序池。在低成本的网站托管方案中,每个应用程序池拥有大量站点是有意义的。

内存限制实际上只是原始安全阈值,可以防止站点消耗所有系统资源。请注意,与IIS 6.0 x86相比,Windows 2008 R2 x64上的潜在问题更多,因为x86应用程序具有2 GB的自然内存上限。在IIS 7.5上,存在内存泄漏的应用程序要消耗大量内存要容易得多。

我也不是回收应用程序池的忠实拥护者。如果我有一个应用程序池,而我是唯一运行的应用程序,则如果我们的代码没有任何问题,则可能无需回收该应用程序池。如果应用程序存在缺陷,则最终的适当措施是修复代码。


感谢您指出内存的32位上限。我不知道我怎么忘记这些东西。我还认为,如果您的应用程序有足够的缺陷导致应用程序池崩溃,那么正确的方法是进行修复(假设您可以访问代码)。我感谢您的建议!
埃里克·伯查姆

我们做了一些自己的测试。运行一个应用程序池似乎比每个应用程序池都在同一应用程序池中运行所有应用程序的开销大约为64K。使用性能监视器监视内存消耗的时间超过了12小时。这是在64位服务器上。我认为,如果此简单测试正确无误,那么在现代硬件上,每个应用程序一个应用程序池的资源成本基本上可以忽略不计。
埃里克·伯查姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.