【问题标题】:ASP.NET Web Garden - How Many Worker Processes Do I Need?ASP.NET Web Garden - 我需要多少个工作进程?
【发布时间】:2011-01-10 05:03:08
【问题描述】:

决定一个 ASP.NET Web 应用程序允许多少工作进程的最佳做法是什么?

在我管理的一台服务器上,创建一个新的 AppPool 默认为 10 个(最大)工作进程。其他人建议正常设置为一。

多个工作进程解决什么问题以及决定多少个工作进程的技术是什么?

【问题讨论】:

  • 我不确定这是在这里还是在 ServerFault 上更合适,如果我做出了错误的选择,请告诉我,我会移动它。
  • 继续在这两个地方询问。我认为你的问题在这里是相关的。 ASP.Net 部署的细节通常属于开发人员的专业领域,尤其是与应用程序优化有关的领域。
  • 我同意 DOK。两个地方都合适。开发人员通常必须告诉网络人员如何配置服务器。因此,他们需要拥有这些信息。
  • 我现在是其中的开发者之一 :)

标签: asp.net web-applications iis-7 worker-process


【解决方案1】:

工作进程是一种跨多个 exe 分割网站执行的方法。您这样做有几个原因,一个是如果其中一名工作人员因运行时问题而受到重创,它不会让其他工作人员失望。例如,如果一个 html 请求进入,导致进程停止运行,那么只有该一个工作处理器正在处理的其他请求被杀死。另一个例子是,一个请求可能会导致对同一工作者处理的其他线程的阻塞。

至于你需要多少,做一些负载测试。用力点击应用程序,看看只有一个会发生什么。然后再添加一些并再次点击它。在某些时候,您将达到真正使机器网络、磁盘、cpu 和内存饱和的程度。那时你就知道你有正确的平衡。

顺便说一句,您可以通过 machine.config 文件控制每个工作进程使用的线程数。我相信关键是 maxWorkerThreads。

现在,请注意,如果您使用会话,则会话状态不会在工作进程之间共享。我通常建议避免会话,但这是需要考虑的事情。

出于所有意图和目的,您可以将每个工作进程视为自己独立的 Web 服务器。除了它们在同一个盒子上运行。

【讨论】:

  • 事实上,引发这个问题的是会话状态的问题(参见stackoverflow.com/questions/2147578/…)。感谢您提供有用的答案 (+1)
  • 默认设置通常为 1。您的默认为 10 的服务器必须经过修改才能更改其默认值。
  • @ChrisLively,会话状态在工作进程之间共享,事实上会话状态也在具有相同 cookie 名称的多个网站之间共享。
  • @AkashKava:默认的 InProc 会话状态不在工作进程之间共享。共享它的唯一方法是使用进程外会话状态。这意味着您必须配置会话状态服务器。
  • @aaronLS:我相信我想说的是,如果工作进程中的一个线程死于可怕的死亡(例如:未捕获的异常),那么一个线程将杀死整个工作进程 - 包括当前正在运行的其他线程。但是,它不会影响正在执行的其他工作进程(及其线程)。
【解决方案2】:

内存泄漏

另一个最大的优势是处理内存泄漏。有时您尝试优化代码多少,但框架本身和其他第三方库中存在内存泄漏。我们注意到,最终我们的应用程序会达到非常高的内存,并且开始不会出现内存异常。

所以我们不得不将工作进程的最大虚拟内存限制设置为 1GB,并允许多个进程运行。您甚至可以为单个工作进程设置最大虚拟限制,但这会导致速度变慢,因为当工作进程被回收时,所有请求都很慢,直到工作进程获得良好的速度。由于我们的应用程序有内部缓存(实体框架查询缓存,一些对象池),这些东西中的每一个都会减慢应用程序的启动速度。这是单个工作进程最痛苦的地方。

如果有多个工作进程,只有一个处于回收模式的进程很慢,但其他进程保持良好的速度。

【讨论】:

    【解决方案3】:

    另一个有意义的情况是拥有许多工作进程是如果您的应用程序包含阻止其并行化的锁。基于 GDI+ 的图像处理就是其中之一。

    我在尝试为my problem 寻找解决方案时发现了它。

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 2013-12-26
      • 2016-05-25
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多