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

69

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

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

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


1
我不确定这个问题更适合放在这里还是放在ServerFault上,如果我做了错误的选择,请告诉我,我会将其移动。 - Tim Long
4
可以在两个地方都问。我认为你的问题在这里很相关。ASP.Net部署的具体细节通常属于开发人员的专业领域,尤其是涉及应用程序优化方面的内容。 - DOK
7
我同意DOK的观点。这两个位置都是适当的。开发人员通常是告诉网络管理员如何配置服务器的人。因此,他们需要了解这些信息。 - NotMe
1
我目前就是其中一位开发者 :) - CokoBWare
3个回答

67

工作进程是一种将网站的执行分割成多个exe的方法。你这样做有几个原因,其中之一是如果一个工作进程被运行时问题摧毁,它不会导致其他进程崩溃。例如,如果一个HTML请求导致该进程无法运行,那么只有由该工作进程处理的其他请求会被关闭。另一个例子是一个请求可能会阻塞同一工作进程处理的其他线程。

至于需要多少个工作进程,可以进行一些负载测试。大力打击应用程序,看看只使用一个进程会发生什么。然后再增加一些进程并再次打击它。在某些点上,您会达到真正饱和机器网络、磁盘、CPU和内存的时候。那时,您就知道已经达到了正确的平衡点。

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

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

从所有意义上讲,您可以将每个工作进程视为自己独立的Web服务器。除了它们在同一台计算机上运行。


2
实际上,会话状态的问题引发了这个问题(请参见https://dev59.com/XHI95IYBdhLWcg3wzRTv)。感谢您提供有用的答案(+1)。 - Tim Long
3
默认设置通常为1。你的服务器默认值为10,必须已经被修改以更改其默认设置。 - NotMe
1
@ChrisLively,会话状态在工作进程之间是共享的,事实上,会话状态也在具有相同cookie名称的多个网站之间共享。 - Akash Kava
13
默认情况下,InProc会话状态不在工作进程之间共享。唯一可以共享它的方式是使用外部进程会话状态,这意味着您必须配置一个会话状态服务器。 - NotMe
如果收到一个导致进程无法运行的HTML请求,那么只有由该工作进程处理的其他请求会被终止。我认为这不是一个准确的描述方式。它似乎暗示着单个长时间运行的请求可以阻塞其他请求,但在工作进程中有工作线程来确保可以同时处理多个请求。也许这不是您想传达的意思,但对于那些试图理解此设置的人来说可能会产生误导。 - AaronLS
3
@aaronLS说:“我相信我想要表达的是,如果一个工作进程内的一个线程出现了致命错误(例如:未捕获的异常),那么这个线程将会杀死整个工作进程,包括当前正在运行的其他线程。但它不会影响正在执行的其他工作进程(及其线程)。 - NotMe

6

内存泄漏

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

因此,我们不得不在工作进程上设置最大虚拟内存限制,例如1GB,并允许多个进程运行。您甚至可以为单个工作进程设置最大虚拟限制,但这会导致减速峰值,因为当工作进程被回收时,所有请求都会变慢,直到工作进程获得良好的速度。由于我们的应用程序具有内部缓存(Entity Framework查询缓存、一些对象池),这些东西中的每一个都会减慢应用程序的启动速度。这就是单个工作进程最受影响的地方。

如果有多个工作进程,则只有一个进程处于回收模式且会变慢,而其他进程仍然保持良好的速度。


3

当应用程序包含锁定(防止并行处理)的情况时,有多个工作进程是有意义的。 GDI +图像处理就是其中之一。

我在尝试解决我的问题时发现了这个例子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接