博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我对asp.net并行请求数量的理解
阅读量:5148 次
发布时间:2019-06-13

本文共 2366 字,大约阅读时间需要 7 分钟。

当一个网站访问量比较大后,除了对功能和逻辑更合理的实现,还需要关注服务器的负载,对请求数量的处理和配置,这个方面也没找到很多明确说明的资料,根据自己的理解和网络的资料,整理了一下理论知识,为以后自己或大家做具体设置和配置的时候,希望能作出一定的帮助。下面基本都是自己的理解,有理论的,有具体配置的,为了不误导我和更多的人,如大家发现不对,请批评指证。

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和自己总结,里面一些还需要验证,作为自己以后测试参考数据记录,如果你也不太清楚,请带着怀疑的态度对待,如果有不对的地方,请指正。

 

转载于:https://www.cnblogs.com/Lawson/archive/2011/01/18/1938706.html

你可能感兴趣的文章
windows 常用操作
查看>>
算法(第四版)C# 习题题解——1.4
查看>>
软件测试第一次作业
查看>>
angular中处理多个异步请求的方法汇总
查看>>
一个关于vue+mysql+express的全栈项目(五)------ 实时聊天部分socket.io
查看>>
jQgrid合并行
查看>>
TopK
查看>>
网络协议分析工具wireshark
查看>>
FlowPortal-BPM——功能:判断数据库表中字段是否重复并阻止提交或保存
查看>>
打开终端,提示 “无法加载文件C:\XXX\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本” 的错误...
查看>>
【Web技术学习】JS学习笔记
查看>>
React Native的缓存和下载
查看>>
Python 正则表达式入门(初级篇)
查看>>
python学习之三 scrapy框架
查看>>
[转帖]Docker常用命令总结
查看>>
多线程GCD-牛逼中央调度器
查看>>
找水王
查看>>
牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)
查看>>
专为多设备、多分辨率应用而设计
查看>>
51nod 1298 圆与三角形
查看>>