IIS 中 ASP.net 应用程序的单独应用程序池

Posted

技术标签:

【中文标题】IIS 中 ASP.net 应用程序的单独应用程序池【英文标题】:Separate application pools for ASP.net applications in IIS 【发布时间】:2010-11-19 09:51:54 【问题描述】:

我已阅读建议,我们应该为 Win2008 服务器上的每个 asp.net 应用程序创建单独的应用程序池。

我们有大约 20 个应用程序将在同一台服务器上。我知道这会创建 20 个独立的工作进程,这似乎非常浪费。

为每个应用程序创建单独的应用程序池是一种好习惯吗?

【问题讨论】:

您可能想在 serverfault.com 上查看此答案。 serverfault.com/questions/2106/… Pros and cons of having dedicated application pools over keeping web applications in one default app pool的可能重复 【参考方案1】:

转自 ServerFault,“Why add additional application pools in IIS?”

AppPool 可以以不同身份运行,因此您可以通过这种方式限制权限。 您可以为每个应用程序池分配不同的标识,以便在运行任务管理器时知道哪个 w3wp.exe 是哪个。 您可以回收/重启一个应用程序池,而不会影响在不同应用程序池中运行的网站。 如果您的网站存在内存泄漏或一般行为不端,您可以将其放置在应用程序池中,以免影响其他网站 如果您的网站占用大量 CPU 资源(例如调整照片大小),您可以将其放置在自己的应用程序池中并限制其 CPU 利用率 如果您有多个网站,每个网站都有自己的 SQL 数据库,您可以使用 Active Directory 身份验证,而不是将用户名/密码存储在 web.config 中。

【讨论】:

【参考方案2】:

如果有原因,在池中分离应用程序是一件好事,并且上面列出了许多好的原因。但是,也有充分的理由不将应用程序分成不同的池。

使用相同访问权限、.NET 版本等的应用程序将在单个池中更高效地运行并且更易于维护。最烦人的是,IIS 会杀死空闲的应用程序池,需要在每次使用时重新创建池。如果您隔离不常用的应用程序,您将给用户带来不必要的启动成本。将这些应用程序组合到一个池中将使用户在不支付启动成本时更快乐,在服务器不为多个进程和 CPU 片分配内存时更快乐,当管理员必须管理更少的应用程序时更快乐游泳池。

【讨论】:

“如果有理由,这是一件好事”.... 完全正确。如果你找不到适合你的理由,那就不要这样做。【参考方案3】:

我曾经在同一台 IIS7.5 服务器上拥有 58 个 .Net 网站和 17 个旧的经典 ASP 网站,每个网站都使用单独的应用程序池。我注意到 IIS 压缩开始间歇性地失败,导致样式表在大约 5% 的时间内损坏。查看服务器上的任务管理器,我可以看到服务器正在接近它的 4GB 内存限制 - 每个 w3wp.exe 进程占用的内存高达 100 MB,具体取决于站点获得的流量。然后,我将所有网站移动到仅 2 个应用程序池中(一个用于 .net 4 网站,一个用于旧的经典 ASP 站点),这样做后使用的总内存从 3.8GB 下降到略低于 2.8GB - 为我节省了超过 1GB 的内存服务器上的空间。更改后(并让服务器运行几个小时以恢复正常的流量水平),w3wp 进程对所有 .net 网站使用 300MB,对经典 ASP 网站使用 20MB。我可以再次重新启用 IIS 压缩而不会出现问题。

出于上述其他帖子中提到的许多原因,使用单独的 APP 池是一个好主意,但根据我的经验,如果您在同一台服务器上托管大量网站,它也会导致更高的内存开销。

我想是否要使用单独的应用程序池是硬件限制和安全性之间的权衡。如果你有足够的资源来做这件事,那是个好主意。

【讨论】:

【参考方案4】:

是的,即使是 20 个应用程序也是一个好主意。

    安全。不同的应用程序池在不同的帐户下运行。 隔离。一个崩溃的应用不会关闭其他应用。 内存(如果您运行的是 32 位)。每个应用程序池都有自己的地址空间。因此,您可以处理比 1 个进程最多约 2.7GB 的可用空间更多的内存。 您可以选择定期重启一个表现不佳的应用,而不影响其他应用。

【讨论】:

很老的帖子,但我认为值得注意的是,2.7 GB 可能只是允许的进程最大内存。请参阅此处:blogs.msdn.microsoft.com/tom/2008/04/10/… 您可以考虑再添加 2 个池来共享内存负载,以确保不会导致大量页面文件使用。【参考方案5】:

如果您的应用程序稳定且不使用太多内存,那么我会说将它们放在同一个应用程序池中就可以了。应用程序池可让您在应用程序之间进行隔离。

【讨论】:

【参考方案6】:

我在创建应用程序池时考虑的一个主要原因是流程管理。还有其他原因,比如安全等。 当 IIS 托管的应用程序崩溃时,它也会关闭其宿主进程。在以前版本的 IIS 中,这意味着所有 Web 活动都一起崩溃。使用应用程序池,您可以将您的应用程序彼此隔离。如果一个有内存泄漏并不断崩溃,您的其他应用程序将继续运行。

【讨论】:

【参考方案7】:

创建不同应用程序池的主要好处是您可以为每个池提供其他凭据。您的 20 个应用程序可能与 20 个不同的数据库进行通信,这些数据库都需要再次登录。最佳做法是使用不同的服务帐户运行每个应用程序。

我不会太担心性能。大部分时间可能会花在每个 Web 应用程序中,无论每个应用程序处于什么进程。

【讨论】:

【参考方案8】:

这实际上取决于应用程序、您的安全模型以及您对应用程序的信任程度。

我总是告诉人们在使用应用程序池时要考虑以下几点。

如果每个应用程序需要不同的系统资源访问权限,请使用单独的应用程序池。 (可以使用多个进程帐户) 如果应用程序占用资源、任务关键或“未知”,最好将其放入自己的池中以将其与系统的其余部分隔离

【讨论】:

【参考方案9】:

我们是一家大型企业客户的外部承包商。我们不在现场,因此我们无法连接到他们的所有系统。有时在开发过程中,我需要直接在他们的开发服务器上调试应用程序。为此,我必须能够附加到 w3wp 进程。当我附加并开始调试时,整个进程停止,这会影响同一进程/应用程序池中的所有应用程序。 通过创建一个专用的应用程序池并将我的开发转移到那里,我可以轻松地进行调试,而不会让任何人的生活变得痛苦。

【讨论】:

以上是关于IIS 中 ASP.net 应用程序的单独应用程序池的主要内容,如果未能解决你的问题,请参考以下文章

从 IIS 上的 ASP.NET Core 应用程序请求超时

如何将针对 net452 项目的 ASP.NET Core 部署为 IIS 中网站的 IIS 应用程序

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

IIS 中 ASP.NET Core 应用程序内的虚拟目录

调试在 IIS 中运行的 ASP.NET Core 应用程序

ASP.NET 应用程序转到 500.21 ...直到 IIS 重置 + 清除临时 ASP.NET 缓存