![IIS 7.x 应用程序池最佳实践](https://linux22.com/image/564504/IIS%207.x%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.png)
我们即将将一些网站部署到一些新服务器上。我对应用程序池有以下疑问:
每个网站最好有一个应用程序池。这种方法有什么注意事项吗?一个应用程序池会占用所有 CPU、内存等吗?
何时应允许应用程序池中有多个工作进程?何时不应?
私有内存限制是否可用于防止一个应用程序池干扰另一个应用程序池?将其设置得太低是否会导致有效请求在没有得到有效响应的情况下回收应用程序池?
私有内存限制和虚拟内存限制之间有什么区别?
是否有令人信服的理由不为每个站点运行一个应用程序池?
答案1
1) 似乎建议每个网站都设置一个应用程序池。这种方法有什么注意事项吗?例如,一个应用程序池会占用所有 CPU、内存等吗?
这是一种非常好的方法;我认为没有理由让不同的“站点”(应用程序)共享同一个池。除非它们需要共享某种单一资源。理论上,一个应用程序可能会占用大量 CPU 或内存,但更改应用程序的池化方式实际上不会产生太大影响。
2) 何时应允许应用程序池中有多个工作进程?何时不应?
最好不要管它,使用默认设置。除非你真的知道自己在做什么,否则这实际上会对你的网站/应用程序产生负面影响。
3) 私有内存限制是否可用于防止一个应用程序池干扰另一个应用程序池?将其设置得太低是否会导致有效请求在没有得到有效响应的情况下回收应用程序池?
a) 理论上
b) 是的,将其设置为较低可能会产生负面影响。同样,除非您有特定需求并且知道自己在做什么,否则请忽略这些。
4)私有内存和虚拟内存限制有什么区别?
这非常复杂,我发现这里有一篇可能有帮助的快速帖子:http://cybernetnews.com/cybernotes-windows-memory-usage-explained/
5)是否有令人信服的理由不为每个站点运行一个应用程序池?
再次,我能想到的唯一原因是,如果多个应用程序需要某种“共享资源”,那么您会希望在同一个进程中运行它们。
对于通用应用程序和网站,IIS 的默认值设置得相当好。
****更新****
关于您对 #2 的更多信息的请求,除非您有特定需要,否则您不应该这样做。即使服务器操作需要很长时间,请求也会使用多个线程来处理,并且您可能希望使用“异步请求”来处理长时间运行的任务(这会释放线程池线程来处理其他请求)。实际上,我想不出任何允许单个池使用多个进程的好理由。
一旦您开始谈论多个进程,那么您可能会遇到如下情况:由于会话在进程 1 中处于活动状态,但请求正在由进程 2 处理,因此丢失会话状态。或者更糟糕的是,您必须弄清楚如何进行某些进程间通信,这真的很痛苦。
无论您对多个进程的原因有何看法,我都愿意相信有更好的方法来处理它(而不是启动另一个进程)。
答案2
我总是为网站配置一个专用的应用程序池。低成本网站托管场景中,每个应用程序池拥有大量网站是有意义的。
内存限制实际上只是基本的安全阈值,用于防止站点消耗所有系统资源。请注意,这在 Windows 2008 R2 x64 上比在 IIS 6.0 x86 上更可能成为问题,因为 x86 应用程序的内存上限是 2 GB。在 IIS 7.5 上,内存泄漏的应用程序消耗大量内存要容易得多。
我也不太喜欢回收应用程序池。如果我有一个应用程序池,而且我是唯一运行的应用程序,如果我们的代码没有问题,那么可能就不需要回收应用程序池。如果应用程序中有缺陷,那么最终的适当操作就是修复代码。