ASP.NET Web Garden - 我需要多少个工作进程?

Tim*_*ong 62 asp.net iis-7 web-applications worker-process

决定允许ASP.NET Web应用程序允许的工作进程数的最佳实践是什么?

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

多个工作流程解决了什么问题,决定多少工作的技术是什么?

Not*_*tMe 57

工作进程是一种跨多个exe分段执行网站的方法.你这样做是出于几个原因,其中一个原因是,如果其中一个工人因运行时间问题而遭受破坏,那么就不会让其他人失望.例如,如果一个html请求进入导致进程无法运行,那么只有那个工作处理器正在处理的其他请求被杀死.另一个例子是一个请求可能导致阻止同一个worker处理的其他线程.

至于你需要多少,做一些负载测试.点击应用程序,看看只有一个会发生什么.然后再添加一些并再次点击它.在某些时候,你将达到真正使机器网络,磁盘,CPU和RAM完全饱和的程度.那时你才知道自己有平衡.

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

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

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

  • @AkashKava:工作进程之间不共享InProc会话状态,这是默认状态.分享它的唯一方法是使用进程外会话状态.这意味着您必须配置会话状态服务器. (11认同)
  • 实际上,引发此问题的是会话状态问题(请参阅http://stackoverflow.com/questions/2147578/asp-net-session-state-and-multiple-worker-processes)。感谢您的帮助(+1) (2认同)
  • 默认设置通常为1.默认为10的服务器必须已修改为更改默认值. (2认同)
  • @aaronLS:我相信我想说的是,如果工作进程中的一个线程死于可怕的死亡(例如:未捕获的异常),那么该线程将杀死整个工作进程 - 包括当前正在运行的其他线程。但是,它不会影响正在执行的其他工作进程(及其线程)。 (2认同)

Aka*_*ava 6

内存泄漏

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

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

如果有多个worker进程,只有一个recycle mode的进程慢,但其他进程保持良好的速度。