ASP.NET Web Garden – 我需要多less个工作进程?

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

在我pipe理的一台服务器上,创build一个新的AppPool默认为10(最大)工作进程。 其他人认为正常情况是一个。

多个工作stream程解决什么问题?决定多less?

工作进程是一个分段跨越多个exe的网站执行的方式。 你这样做有两个原因,一个是如果其中一个工人受到运行时间问题的影响,那么这个问题不会让其他人失望。 例如,如果一个html请求进来导致进程没有任何运行,那么只有其他请求正在被这个工作进程处理。 另一个例子是一个请求可能导致对同一个worker处理的其他线程进行阻塞。

至于你需要多less,做一些负载testing。 点击应用程序,看看发生了什么只有一个。 然后再添加一些,然后再打一次。 在某些时候,你会达到一个真正饱和的机器networking,磁盘,CPU和内存点。 那是当你知道你有平衡的时候。

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

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

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

这里的指导是相当不错的: http : //msdn.microsoft.com/en-us/library/ms998549.aspx

内存泄漏

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

所以我们必须将工作进程的最大虚拟内存限制设置为1GB,并允许多个进程运行。 即使对于单个工作进程,您也可以设置最大虚拟限制,但这会导致速度减慢,因为当工作进程被回收时,所有请求都会很慢,直到工作进程获得良好的速度。 由于我们的应用程序具有内部caching(entity framework查询caching,一些对象池),这些东西都会减慢应用程序的启动速度。 这是单一工人stream程最痛的地方。

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

另一种情况是,如果您的应用程序包含阻止并行化的锁,那么有很多工作进程是合理的。 基于GDI +的image processing就是其中的一个例子。

当我尝试为我的问题find解决scheme时,我发现它。