【问题标题】:What is the relationship between Application Pools and worker process threads?应用程序池和工作进程线程之间有什么关系?
【发布时间】:2013-07-02 14:36:27
【问题描述】:

我正在对 ASP.NET 应用程序中的重新启动进行故障排除。该应用程序每天重新启动大约 20 次。我们强烈怀疑应用程序的一部分,因为当这个特定功能投入生产时,重新启动就开始了。我已经使用 log4net 库向这些页面添加了一些日志记录,但我在解释日志时遇到了问题。

当 ASP.NET 应用程序在应用程序池中运行时,是只运行该应用程序的一个实例,还是运行该应用程序的多个实例?我知道会产生几个工作进程线程。工作进程线程与应用程序池中运行的应用程序的关系是什么?

我认为如果有多个应用程序记录到同一个日志,我可能无法正确解释结果。如果一个重新启动但另一个没有,则日志并不能真正告诉我重新启动时发生的事情。

更新 1

查看this page,发现如下信息:

应用程序池定义一组一个或多个工作进程,并配置有向分配给该应用程序池的一个或多个应用程序提供请求的通用设置。因为应用程序池允许一组 Web 应用程序共享一个或多个类似配置的工作进程,所以它们提供了一种方便的方法来将一组 Web 应用程序与服务器计算机上的其他 Web 应用程序隔离开来。进程边界将每个工作进程分开;因此,一个应用程序池中的应用程序问题不会影响其他应用程序池中的网站或应用程序。

但我还是很困惑。我从经验中知道,我可以分配两个完全不同的应用程序来使用同一个应用程序池。这是否意味着将产生两个工作进程?或者是否可以为第一个应用程序生成多个工作进程,并为第二个应用程序生成多个工作进程?如果一个工作进程出现问题,它能否关闭该应用程序池中运行的所有应用程序?

更新 2

this page about using WinDbg,我找到了这个信息(强调我的):

在 IIS 5.x 中,只有一个 Aspnet_wp.exe 工作进程和一个调试器线程。因此,一次只能将一个调试器附加到 Aspnet_wp.exe 进程。如果您在同一台机器上处理多个 Web 应用程序,这可能会造成问题。在 IIS 6.0 中,您可以强制 AppDomain 在单独的应用程序池中运行。 (有关详细信息,请参阅第 1 章中的“IIS 5.x 进程模型”和“IIS 6.0 进程模型”。) 单独的应用程序池提供多个 W3wp.exe 进程。 在这些程序中创建多个调试器线程进程(每个进程一个),让您更有效地调试。

在我看来,这听起来就像每个 App Pool 都有一个 w3wp.exe 进程。我解释对了吗?如果是这样,这是否仍然适用于 IIS 7.5?

【问题讨论】:

    标签: asp.net iis iis-7.5


    【解决方案1】:

    是的,每个应用程序池通常是单个进程1,但可以包含多个线程。您可以将多个站点分配给一个应用程序池,这些站点都将在同一进程下运行,但是它们将在不同的“应用程序域”下运行,这些“应用程序域”是将一个站点的代码与另一个站点的代码分开的安全上下文,即使它们'在同一个应用程序池上重新运行。

    同时访问网站的两个用户可以在不同的线程上运行,这意味着他们可以同时运行。这意味着任何日志记录都可以散布值。您可能希望将会话值添加到您的日志记录中,以便您可以根据会话进行排序。

    应用程序池重启(回收)是正常的,一天重启 20 次似乎并不稀奇。它们每天可能发生多次,并且 IIS 控制应用程序池何时重新启动。每当它感觉需要清理池时,它就会执行此操作。2 您的应用程序应该以能够从这里优雅地恢复的方式编写(即,不要在会话中保留任何不容易处理的内容)如果应用程序池重新启动,则重新创建)。

    当您的应用中发生未处理的异常时,应用池也可以重新启动。在这种情况下,您想解决造成这种情况的原因。此类异常通常记录在事件日志中。


    1 – 虽然您可以将应用程序池配置为拥有多个工作进程(这被称为 Web Garden),但这不是典型的(根据我的经验,通常也不推荐)配置。

    2 – 请注意,使用 IIS 管理器可以将应用程序配置为 log recycle events to the Windows Event Log。您还可以使用 IIS 管理器来设置几种不同类型的回收事件发生时的阈值。

    【讨论】:

    • 因此,如果我的理解正确,可以将多个应用程序添加到单个应用程序池中,并且每个应用程序将有一个工作进程。但是每个工作进程中会有多个线程,每个线程都有自己的应用程序域以确保安全。这一切都正确吗?我已经记录了 AppDomain ID 和 Session ID,所以我可以使用其中任何一个来分隔每个会话。我只是不确定所有这些部分的关系。
    • @CharlieKilian - 不,您没有正确理解。每个应用程序池有一个工作进程。您可以在一个应用程序池中拥有多个应用程序。一个应用域不特定于任何线程,单个进程中可以存在多个应用域。
    • 啊。感谢您的澄清。这很有帮助。
    • 重启发生在我们推出特定功能集之后,不幸的是它相当大。因此,我们确定某处存在问题。事件日志只显示HostingEnviornment.ShowdownReason。我在这里有一个单独的问题:stackoverflow.com/questions/17428720/…
    • @CharlieKilian - 我不一定会过分关注您最近的代码。这可能是相关的,也可能是巧合。不要忽视其他可能性。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2021-12-04
    • 2014-02-05
    • 2011-05-24
    相关资源
    最近更新 更多