当一个网站访问量比较大后,除了对功能和逻辑更合理的实现,还需要关注服务器的负载,对请求数量的处理和配置,这个方面也没找到很多明确说明的资料,根据自己的理解和网络的资料,整理了一下理论知识,为以后自己或大家做具体设置和配置的时候,希望能作出一定的帮助。下面基本都是自己的理解,有理论的,有具体配置的,为了不误导我和更多的人,如大家发现不对,请批评指证。
asp.net并发请求数量影响的条件相当多,不考虑程序执行时间和是否被阻塞,它会受到服务器tcp(一般windows服务器好像没限制)连接数限制,iis连接数限制,CLR线程池对它的限制。
服务器TCP限制,[HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] “EnableConnectionRateLimiting” =dword:00000000, 该注册表项的值改成 “0” 即可,如果是比如windows2003服务器,一般是没有这个限制的,比如我自己的2003没有。
IIS连接数限制:IIS6及以下,%systemroot%\System32\inetsrv\下的metabase.xml文件里直接修改,比如修改默认的AspRequestQueueMax="3000",可以把请求排队列队设置更大,修改默认的AspProcessorThreadMax="25",把request并发请求线程设置更大等,具体可以参考相关资料,进程太多会设置到CPU切换线程要耗时,根据网上说法,并不是越大越好,但可以综合根据并发量和系统性能相关形成设置;IIS7配置的地方又不一样了,%systemroot%\System32\inetsrv\config\applicationHost.config文件里修改,修改<serverRuntime appConcurrentRequestLimit="5000" /> ,并发请求限制数量,
IIS Manager > ApplicationPools > Advanced Settings, Queue Length:1000修改队列长度.HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters MaxConnections 修改更大。
.net框架方面的限制
我认为一个asp.net程序运行起来后, 不关心不同的IIS版本,它们生命逻辑不一样,IIS6交给的进程之前也不一样,但我认为该进程都至少由三个线程池来管理,一个CLR负责不同request请求的工作线程池,一个IO处理线程,还有该进程的非托管级的线程池,托管的这两个线程池的初始化和最大数量都可以配置和程序设置,非托管的线程池用于中转请求给CLR处理,和有IO或者其他异步操作时,处理的非托管级线程。当然托管级的线程池我们是可以作一定控制的,不同.net版本,和系统CPU数量,初始化线程池数量是不一样的,比如我现在CPU是单CPU双核系统,在.NET4下一个MVC请求中执行下面代码:
int workThread = 0;
int ioThread = 0;
ThreadPool.GetMaxThreads(out workThread, out ioThread);
获取到最大工作线程池和IO线程池都为200,但如果根据相关资料,说该值为100 *CPU数量(双核也算多个CPU),windows程序中获取到的值将更大,说明默认系统给的线程数是不一样的。
在不同.net版本中,machine.config中<processModel autoConfig="true"/>采用默认配置,我觉得应该是.net不同版本里直接写死了默认线程数量等信息,可以通过修改machine.config中该节点的一些值来达到不同的目的,默认配置的一下参数:
- 设置maxWorkerThreaders和maxIoThreads为100
- 设置maxconnection 为12*CPU数量
- 设置minFreeThreads为88*CPU数量
- 设置minWorkerThreads为50
最大线程数量 = (最大工作线程 * CPU数量) - 最小空闲线程, 当然还有其他一些重要的参数。
这些都是iis6和iis7经典模式下的配置文件的修改,ii7集成模式又有点不一样了,请求最大数量由下面决定:maxConcurrentRequestsPerCPU:限制每个CPU执行的请求的数量,即使有更多的线程可用。在.NET 3.5及以前的版本中,默认值是12,在.NET 4中是5000。如果设为0,没有限制;maxConcurrentThreadsPerCPU:限制每个CPU处理请求的线程的数量。默认值是0,没有限制。这基本上就相当于对请求数量没有限制了,同时 <processModel
requestQueueLimit="10000"/> 加了
表示请求排队队列10000,在%systemroot%\System32\inetsrv\config\applicationHost.config中设置,<serverRuntime appConcurrentRequestLimit="10000" /> ,都是增加并行请求限制的,具体的可以查看相关资料。
这篇文章部分也是参考别人blog和自己总结,里面一些还需要验证,作为自己以后测试参考数据记录,如果你也不太清楚,请带着怀疑的态度对待,如果有不对的地方,请指正。