IIS 高并发的相关配置

强颜欢笑 提交于 2019-12-17 16:48:23

前言:

  随着业务量的增加,服务器流量的增长增长了好多,高峰期会出现 503 的错误,IIS 对请求数的配置默认是 1000,无法满足现状的需求;

  

  需要收集性能数据如下:

  1、Windows性能监视器,该应用程序池进程的线程和处理队列

  2、问题重现时的进程dump

 

  这是请求到达IIS后遇到的第一个队列,HTTP.sys收到请求后会将请求放入对应的应用程序池队列,这样可以减少上下文的切换。

  需要注意的是应用程序池队列虽然是给w3wp进程用的,但它存在于http.sys的内存区(http.sys是一个运行于kernel-mode的设备驱动程序)。

  如果把 http.sys 比作一块网卡,那应用程序池队列相当于网卡的缓冲区。

  w3wp 从应用程序池队列中取出请求后,接下来就是从CLR线程池中捞出一个CLR线程处理请求,如果池中空无一线,就会将请求放在CLR线程池队列中。

 

  检测两个队列的情况,可以使用Windows性能监视器

  Http Service Request Queues\CurrentQueueSize

  Http Service Request Queues\ArrivalRate

  ASP.NET v4.0.30319\Requests Queued

  ASP.NET v4.0.30319\Requests Current

 

一、应用程序池(Application Pool –> 高级设置  –> 队列长度)

  • General->Queue Length设置为65535(队列长度所支持的最大值,缺省值为1000)
  • Recycling->Regular Time Interval设置为0(取消应用程序池固定时间间隔的自动回收,缺省值为1740)
  • Process Model->Idle Time-out设置为0(取消应用程序池因为空闲超时而关闭,缺省值为20分钟)
 1 <!-- 调大应用程序池的请求队列 -->
 2 C:\Windows\System32\inetsrv>appcmd set apppool webform -queueLength:65535
 3 <!-- 取消固定时间间隔的回收 -->
 4 C:\Windows\System32\inetsrv>appcmd set apppool webform -recycling.periodicRestart.time:00:00:00
 5 <!-- 设置指定时间点的回收 -->
 6 C:\Windows\System32\inetsrv>appcmd set apppool webform /+recycling.periodicRestart.schedule.[value='04:15:00']
 7 <!-- 取消空闲超时的进程关闭 -->
 8 C:\Windows\System32\inetsrv>appcmd set apppool webform -processModel.idleTimeout:00:00:00
 9 <!-- 开启所有回收事件的日志 -->
10 C:\Windows\System32\inetsrv>appcmd set apppool webform -recycling.logEventOnRecycle:"Time, Requests, Schedule, Memory, IsapiUnhealthy, OnDemand, ConfigChange, PrivateMemory"

 

 

  IIS  (C:\Windows\System32\inetsrv\config\applicationHost.config)

   1、设置命令:

c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

       2、设置结果:

<!-- IIS并发请求数 --> 
<serverRuntime appConcurrentRequestLimit="100000" />

 

 

  .NET Framework & ASP.NET  (C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config 和 WebAppRoot\web.config)

<!-- .NET Framework 进程模型 配置,最大工作线程(真实的线程数 = 此值 * 逻辑CPU数) --> 
<processModel enable="true" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50" />

<!-- ASP.NET 请求处理队列 --> 
<httpRuntime appRequestQueueLimit="100000"/>

 

 

二、网络协议

  0、是否是连接数达到了上限,win2008以前的版本,对半开连接数是有限制的,但是从win7、win vista、win2008之后就关闭了该项限制

       1、将最大连接数设置为10万

  reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 100000  reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters /v MaxFieldLength /t REG_DWORD /d 32768  reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters /v MaxRequestBytes /t REG_DWORD /d 32768 

       2、修改TCP MaxUserPort限制(由默认5000改为65534)

    reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v MaxUserPort /t REG_DWORD /d 65534 

       3、 net stop http  & net start http & iisreset  (干脆直接重启计算机)

 

  转载自:

  压力测试报出503错误---ASP.NET支持大并发的相关配置

  云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!