首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度。先说这2个数字在哪里看。

最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并点击【管理网站】->【高级设置】。打开对话框如下图:

队列长度:在IIS中选中【应用程序池】,在应用程序池列表中,右键你想查看的,在右键菜单中选择【高级设置】。打开如下对话框:

这两个数字表面上看是影响我们站点的并发处理能力的,但是具体是如何影响一个网站的并发处理能力的呢?要完全理解IIS的并发处理能力,除了这2个数字,实际上还有一个非常关键的数字:IIS最大并发工作线程数。

1. IIS最大并发工作线程数

在以前很长一段时间,我一直以为IIS的【最大并发连接数】就是影响IIS最大并发工作线程数。我以为将【最大并发连接数】设置为1万,那么当1万个请求同时到来的时候,IIS会开启1万个线程进行处理,如果同时到来2万个请求,由于最大并发连接数只有1万,那么剩余1万个请求就会放在队列里面,当前面的1万个线程中某个完成了请求之后,再从队列里面取一个请求。但,这个理解是完全错误的,相信很多朋友也跟我有同样的理解。

现在,首先让我们来理解什么是【IIS最大并发工作线程数】。这个数字在IIS里面是没有界面进行设置的,我以前根本就不知道有这个数字。这个数字跟操作系统相关,我的win7系统的IIS的值是10,VS2012自带的IIS Express的值是80。对于windows服务器版本的系统的具体值是多少没有测试过,但我猜应该也是有限制的。

这个数字到底是什么意思呢?回到上面举的例子,当1万个请求同时进入IIS的时候,由于win7系统的IIS只有10个工作线程,那么这时1万请求中只有10个请求会在第一时间被处理,剩余9990个请求都需要排队。也就是说,IIS最多能够安排10个线程同时处理请求(win7版本的IIS,有的可能是20)。

所以,如果你用自己的win7系统测试IIS的性能的时候,你可能发现,不管你怎么设置【最大并发连接数】,你的IIS处理能力都很有限。

2. 最大并发连接数

上面讲的IIS最大并发工作线程数,看上去就是IIS的并发处理能力,如果是这样,那么【最大并发连接数】有什么意义呢?

还是上面的例子,如果1万个请求同时到来,而我们的win7系统的IIS最大并发工作线程数只有10,这时如果将【最大并发连接数】设置为100,会有什么效果呢?答案是:只有100个请求会收到正常响应,剩余9900个请求直接返回503(服务不可用)的错误。这时,实际上进入排队等待的只有90个请求。

再换下测试参数,如果将【最大并发连接数】设置为5000,又会有什么效果?答案你可能已经知道了,那就是一开始就有5000个请求直接返回503,剩下5000个请求慢慢正常返回。

这里你看明白了吧,【最大并发连接数】在我们的测试例子中,影响到了排队的数量。这样的话,看上去【队列长度】又不知道什么意思了?

3. 队列长度

在上面的例子中,如果1万个请求同时到来,【最大并发连接数】设置为100。这时我们知道,IIS首先会安排那10个线程去处理10个请求,剩下90个请求都需要排队。这时如果我们将【队列长度】设置为50,那会出现什么情况?答案是,40个请求会直接返回503服务不可用的错误(因为队列只有50个的长度,剩下的40个就无法排队了),最终只有60个请求会被正确处理。

读到这里,你明白了吗?

结论

当很多请求同时到来的时候,IIS会根据【最大并发连接数】来判断是否有多余的请求,多余的请求直接返回503,然后再根据【队列长度】来判断是否有多余的请求排不了队,排不了队的也直接返回503。所以,如何设置【最大并发连接数】和【队列长度】,实际上是有公式可以计算的:

最大并发连接数 = 队列长度 + IIS最大并发工作线程数

最后再说说IIS的默认值对我们网站并发处理能力的影响。IIS默认的【最大并发连接数】为4294967295(42亿多),而【队列长度】默认值为1000。对于windows server版本的IIS,最大并发工作线程数可能几百(猜测,可能没有限制),按照这个默认值,那么IIS同时处理的请求数也就1000多。1000多这个数字才是IIS真正的并发处理能力,而这个能力跟我们的代码没有关系。那么哪些指标是评判我们网站的处理能力的呢?最重要的指标可能莫过于【每秒处理请求数】吧(在性能分析器里面可以查看),这个数字也叫吞吐率。如果每个请求处理速度非常快,那么那么网站吞吐率就大,吞吐率大那么支持的同时在线人数就大。如果要做秒杀,那就看你的秒杀相关的URL支持多大的吞吐率吧。了解了这么多指标,还没有涉及到CPU的计算能力。CPU的计算能力是如何影响网站的处理能力的呢?还是那么多请求,如果CPU很强大,能够缩减每个请求的处理时间,那必然会提高吞吐率。还有很多的请求,如果花在网络传输或者到数据库的传输时间比较多,这部分等待时间CPU是闲置的,如果能够提高CPU的利用率,也可能提高网站的处理能力,最充分的利用服务器的资源。如果不想改代码而想提高CPU利用率,可以在IIS的应用程序池中设置最大工作进程数(默认值为1),可以设置为10如果当前CPU利用率只有百分之几的话,调整这个数值需要特别注意每一个工作进程是独立的应用程序,全局静态变量不共享。

深入理解IIS的多线程工作机制的更多相关文章

  1. [Java] 理解JVM之一:工作机制及基本结构

    一.基本结构 类加载器:在 JVM 启动时或在类运行时需要将类的字节码信息加载到 JVM 内存区域中. 执行引擎:负责执行字节码信息中包含的字节码指令,相当于实际机器上的 CPU. 内存区域:也被称为 ...

  2. IIS最大并发连接数 = 队列长度 + IIS最大并发工作线程数

    深入理解IIS的多线程工作机制   首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度.先说这2个数字在哪里看. 最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并 ...

  3. 深刻理解HDFS工作机制

    深入理解一个技术的工作机制是灵活运用和快速解决问题的根本方法,也是唯一途径.对于HDFS来说除了要明白它的应用场景和用法以及通用分布式架构之外更重要的是理解关键步骤的原理和实现细节.在看这篇博文之前需 ...

  4. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  5. MySQL Proxy和 Amoeba 工作机制浅析

    MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...

  6. 从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制

    作者 | 车漾  阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 20 讲. 关注"阿里巴巴云原生"公众号,回复关键词" ...

  7. 第20 章 : GPU 管理和 Device Plugin 工作机制

    GPU 管理和 Device Plugin 工作机制 本文将主要分享以下几个方面的内容: 需求来源 GPU 的容器化 Kubernetes 的 GPU 管理 工作原理 课后思考与实践 需求来源 201 ...

  8. 深入理解ClassLoader工作机制(jdk1.8)

    ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中    审查每个类由谁加载(父优先的等级加载机制)    将 Class 字节码重新 ...

  9. 深入理解PHP之:Nginx 与 FPM 的工作机制

    网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理 ...

随机推荐

  1. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

  2. a标签点击跳转失效--IE6、7的奇葩bug

    一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...

  3. Spring之旅(2)

    Spring简化Java的下一个理念:基于切面的声明式编程 3.应用切面 依赖注入的目的是让相互协作的组件保持松散耦合:而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件. AOP面向切面 ...

  4. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  5. nodejs项目mysql使用sequelize支持存储emoji

    nodejs项目mysql使用sequelize支持存储emoji 本篇主要记录nodejs项目阿里云mysql如何支持存储emoji表情. 因由 最近项目遇到用户在文本输入emoji进行存储的时候导 ...

  6. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  7. BlockingCollection使用

    BlockingCollection是一个线程安全的生产者-消费者集合. 代码 public class BlockingTest { BlockingCollection<int> bc ...

  8. Extjs 让combobox写起来更简单

    也已经写了很久时间的extjs ,每次都用到很多的combobox,配置很多东西觉得实在是太麻烦,所以根据常用到的情况写了一个简便的combobox,再次记录下来,以免放在某个地方忘记了找不到了. 定 ...

  9. TFS2013 设置签出独占锁

    转载自: http://www.cnblogs.com/zhang888/p/4280251.html

  10. ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...