对于ASP.NET Web应用程序,决定允许多少工作进程的最佳实践是什么?
在我管理的某个服务器上,创建新的AppPool默认是10个(最大值)工作进程。其他人建议正常设置为一个。
多个工作进程解决了什么问题,以及决定使用多少技术的技巧是什么?
对于ASP.NET Web应用程序,决定允许多少工作进程的最佳实践是什么?
在我管理的某个服务器上,创建新的AppPool默认是10个(最大值)工作进程。其他人建议正常设置为一个。
多个工作进程解决了什么问题,以及决定使用多少技术的技巧是什么?
工作进程是一种将网站的执行分割成多个exe的方法。你这样做有几个原因,其中之一是如果一个工作进程被运行时问题摧毁,它不会导致其他进程崩溃。例如,如果一个HTML请求导致该进程无法运行,那么只有由该工作进程处理的其他请求会被关闭。另一个例子是一个请求可能会阻塞同一工作进程处理的其他线程。
至于需要多少个工作进程,可以进行一些负载测试。大力打击应用程序,看看只使用一个进程会发生什么。然后再增加一些进程并再次打击它。在某些点上,您会达到真正饱和机器网络、磁盘、CPU和内存的时候。那时,您就知道已经达到了正确的平衡点。
顺便说一下,您可以通过machine.config文件控制每个工作进程所使用的线程数。我认为关键是maxWorkerThreads。
现在,要注意,如果使用Session,则Session状态不会在工作进程之间共享。我通常建议避免使用Session,但这是需要考虑的事情。
从所有意义上讲,您可以将每个工作进程视为自己独立的Web服务器。除了它们在同一台计算机上运行。
内存泄漏
另一个最大的优势是处理内存泄漏。有时,无论您如何尝试优化代码,但框架本身和其他第三方库中都存在内存泄漏。我们注意到最终我们的应用程序达到非常高的内存并开始发出无内存异常。
因此,我们不得不在工作进程上设置最大虚拟内存限制,例如1GB,并允许多个进程运行。您甚至可以为单个工作进程设置最大虚拟限制,但这会导致减速峰值,因为当工作进程被回收时,所有请求都会变慢,直到工作进程获得良好的速度。由于我们的应用程序具有内部缓存(Entity Framework查询缓存、一些对象池),这些东西中的每一个都会减慢应用程序的启动速度。这就是单个工作进程最受影响的地方。
如果有多个工作进程,则只有一个进程处于回收模式且会变慢,而其他进程仍然保持良好的速度。