在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释。

“黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增,到达HTTP.SYS的请求数(Arrival Rate)下降,QPS(Requests/Sec)下降,CPU消耗下降,Current Connections上升。

昨天晚上18:08左右发生了1次“黑色30秒”,正好借此案例分析一下。

1、为什么Requests Queued会突增?

最直接的原因是ASP.NET没有可用的线程处理当前请求。为什么会没有可用的线程呢?ASP.NET可用的线程毕竟是有限的,可能是当时瞬间的并发请求太多,ASP.NET来不及创建足够的线程处理这些请求。

我们来看一下ASP.NET中线程相关的设置——machine.config中的processModel(位于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)。

有4个相关设置:maxWorkerThreads(默认值是20), maxIoThreads(默认值是20), minWorkerThreads(默认值是1), minIoThreads(默认值是1)。(这些设置是针对每个CPU核)

我们用的就是默认设置,由于我们的Web服务器是8核的,于是实际的maxWorkerThreads是160,实际的maxIoThreads是160,实际的minWorkerThreads是8,实际的minIoThreads是8。

基于这样的设置,是不是如果瞬间并发请求是169,就会出现排队?不是的,ASP.NET没这么傻!因为CLR 1秒只能创建2个线程,等线程用完时才创建,黄花菜都凉了。我们猜测ASP.NET只是根据这个设置去预测线程池中的可用线程是不是紧张,是不是需要创建新的线程,以及创建多少线程。

那什么情况下会出现“黑色30秒”期间那样的大量请求排队?假如并发请求数平时是300,突然某个瞬间并发请求数是600,超出了ASP.NET预估的所需的可用线程数,于是那些拿不到线程的请求只能排队等待正在执行的请求释放线程以及CLR创建新的线程。随着时间的推移,释放出来的线程+新创建的线程足以处理这些排队的请求,就恢复了正常。

那如何验证这个猜测呢? 修改maxWorkerThreads, maxIoThreads, minWorkerThreads, minIoThreads的设置,让ASP.NET提供更多的可用线程,目前我们采用的设置如下:

<processModel enable="true"  requestQueueLimit="5000" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50"/>

如果采用这个设置之后,“黑色30秒”现象几乎不出现,就能验证问题出在这个地方。现在主站www.cnblogs.com已经使用了这个设置,需要观察一段时间进行验证。

【启示】

1) 通过Windows性能监视器监视\ASP.NET\Requests Queued可以直观地评估ASP.NET应用程序的吞吐能力(throughput)。

2) 通过ASP.NET异步编程(async/await)可以有效减少可用线程紧张造成的请求排队问题。

2、为什么Arrival Rate会下降?

(上图中的橙色线条)

这是“黑色30秒”问题中最让人不解的地方,ASP.NET中请求再怎么排队,怎么会造成到达HTTP.SYS的请求数下降呢?一开始我们总是不相信是请求排队引起的Arrival Rate下降,但是监视图中却铁证如山。

写这篇博客之前,我们突然想通了!之前忽略了一个地方——当你打这篇博文时,第1个请求是html页面,如果这个请求得到正常响应,浏览器在加载这个页面时会发出多个ajax请求;如果第1个请求被排队,浏览器处于等待状态,后续的ajax请求就不会发出,这样到达HTTP.SYS的请求数就会下降。这也解释了为什么有时会在“黑色30秒”的中间阶段Arrival Rate会飙高,正是因为当时被排队的请求所对应的页面中有很多ajax,当它结束排队被执行后,后续的很多ajax请求(可能排队的很多是这样的请求)到达了HTTP.SYS。

于是,我们相信了是请求排队引起的Arrival Rate下降。

【启示】

不能把目光局限于当前看到的问题表现,而要综合考虑,将诸多因素联系起来理清各种现象之间的关系。

3QPS下降

与Arrival Rate下降同理,QPS(Requests/Sec)与Arrival Rate是直接相关的,成正比关系。

于是,QPS下降也是因为请求排队。

4CPU消耗下降

也是同理,Arrival Rate与QPS下降,说明CPU要干的活少了,自然消耗就下降。

于是,CPU消耗下降也是因为请求排队。

5Current Connections上升

Current Connections是请求排队的一个直接表现,请求还没被执行,连接当然会保持着。

于是,Current Connection上升也是因为请求排队。

6、看一个新指标Requests Executing

(上图绿色的线条表示的是Requests Executing)

在请求排队的期间,正在被ASP.NET执行的请求数(Requests Executing)在增加,说明随着被释放出来的线程增多以及更多的新线程被创建,排列中的请求正在被越来越多地执行。这从侧面说明了执行中的线程可能是正常的,没有被卡住。(接下来的IIS日志信息会进一步验证这一点)

于是,Requests Executing在增加也是因为请求被排队,而且说明这个排队是正常的,没有哪个地方卡住了。

7、再来看看IIS日志中请求的time-taken

在“黑色30秒”阶段,IIS日志中没有time-taken超过1s的请求!这说明了什么?说明了正在被执行的请求处理速度很快,没有什么地方被卡住。。。除了因为可用线程不够,请求被排队。

于是,IIS日志说明除了请求排队,其他地方一切正常。

【总结】

如果把“黑色30秒”问题归因于ASP.NET线程问题,除了30秒左右的这个时间,其他问题表现都得到了更合理的解释。

写这篇博客之前,我们当时觉得ASP.NET线程问题引起“黑色30秒”问题的可能性是80%,写完这7点分析之后,我们觉得可能性是99%,除非这次分析的“黑色30秒”与之前的“黑色30秒”不是同一个问题。

现在还需要我们使用新设置(maxWorkerThreads="100", maxIoThreads="100", minWorkerThreads="50", minIoThreads="50")之后的验证。

大结局即将来临,重要的可能不是结局是什么,而是其中的过程,我们分享的也是解决问题的过程。

转载于:https://www.cnblogs.com/AmilyWilly/p/4791742.html

黑色30s高并发IIS设置相关推荐

  1. 哪个服务器支持高并发,IIS Web服务器支持高并发设置方法详解

    这篇文章主要介绍了IIS Web服务器如何支持高并发,详细设置方法在下面,大家参考使用吧 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows ...

  2. php设置backlog,高并发调优backlog多大合适?

    么对于nginx,对于php-fpm,backlog应该设置多大,是越大越好吗?backlog怎么设置合适?这是上篇文章中遗留的几个问题 接着上篇文章Nginx高并发调优中常被忽略的参数中,最后部分, ...

  3. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执 ...

  4. Redis多容器高并发场景 , 设置缓存的时候,要考虑多容器加锁的场景。(incr计数和redis分布式锁区别)

    1.设置缓存的时候,要考虑多容器加锁的场景. (1)场景,短信回执场景,会有二次回执的情况,但是我们只处理一次回执的消息体,如何不处理二次回执呢? // 队列中有数据且容量未达到100,可继续放入队列 ...

  5. 高并发多队列网卡设置CPU亲和性项目记录

    之前我转载过一篇smp-affinity的文章https://blog.csdn.net/yue530tomtom/article/details/76216503 实例 做ssl加速卡(高并发)测试 ...

  6. Tomcat高并发设置

    Tomcat高并发配置 解决方法 增加tomcat连接数 在配合做压力测试的时候,有时候提高并发数的时候 莫名的出现服务器卡顿现象,服务器拒绝连接,前端出现502 Bad Gateway等错误信息,而 ...

  7. iis属于中间件吗_今天设计一套高可用高并发、海量存储可伸缩的消息中间件生产架构...

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,更多的可以关注wx,一起将技术学深学透,我会每一篇分享结束 ...

  8. 说说大型高并发高负载网站的系统架构【转】

    我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大 ...

  9. Java处理高并发、高负载类网站的优化方法

    第 1 则 -网站关注点之数据库- 首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个MySQL主机 ...

最新文章

  1. 1.12 梯度的数值逼近-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  2. 一行代码引来的安全漏洞,就让我们丢失了整个服务器的控制权
  3. flex布局_flex布局的 flex(felx-grow、flex-shrink、flex-basis)详解
  4. innodb下的mvcc_InnoDB的MVCC实现原理
  5. Bailian2697 迭代法解方程【二分+迭代】
  6. 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
  7. 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
  8. 学习OpenCV——SVM 手写数字检测
  9. 国内android源码下载网站
  10. 向iframe载入html,为iFrame添加动态载入效果,提高用户体验
  11. 强化学习笔记:马尔科夫链介绍及基于Python的蒙特卡洛仿真
  12. window.open打开txt文件
  13. 古人是怎样酿醋的(图)
  14. 递归实现费氏数列:0,1,1,2,3,5,8,13,21,34,55,89,... ...
  15. 表格控件SpreadJS助力上市企业明源云,打造更智慧的地产生态链
  16. 74cms|骑士cms|开源招聘系统,目录结构
  17. NRF51822---开发板介绍(连载1)
  18. swfobject.js for flash 的使用(for swfobject 2.0)
  19. matlab2020b中的nargin函数报错问题
  20. EasyRecovery五个步骤搞定数据恢复

热门文章

  1. kibana 更新 索引模式_升级 Kibana - Kibana 中文文档
  2. 17 软件源_9成职场人支持“准点下班”,2020年度职场报告:工作是最大焦虑源
  3. php 鼠标点击图片放大,css3如何实现鼠标放上图片放大?(附代码)
  4. 查询linux上调度命令,浅析Linux中crontab任务调度
  5. 计算机专业好还是铁道运输管理好,铁道运输管理专业主要是干什么的?
  6. java 高级泛型_java泛型的高级应用
  7. navicat for mysql 13_Navicat for MySQL下载
  8. python dicom图像分割_python读取DICOM头文件的实例
  9. 店铺咨询系统c语言,课内资源
  10. 阿酷快捷键怎么使用_必须收藏!Linux用户必须知道的常用终端快捷键