根据压测结果做出的修改历史:

第一步:只针对maxWorkerThreads、maxIoThreads和minWorkerThreads做了修改<processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />,发现并无明显性能提升。

第二步:针对第一步,提高了三个参数的值maxWorkerThreads="200" maxIoThreads="200" minWorkerThreads="100" 。并且修改了“每个处理器的线程数限制”,从默认值25提高到50,顺便修改了队列长度从3000到30000。此时,性能有明显提升。

第三步(未执行):修改应用程序池的“最大工作进程数”,即使用IIS的Web Garden功能(多工作进程模式)。

总结:一开始只是提高了IIS的最大、最小线程数,但是由于ASP的每个处理器的线程数限制(25),所以性能并没有明显提升。后来提高了ASP的每个处理器的线程数限制,性能才有明显好转,但直接表现是站点进程的CPU和使用线程数明显升高,导致服务器本身负载飙升。目前这种较为粗暴的直接增大参数指标的优化方式比较适用于服务器上的单站点或者单个负载较高的站点,如果一台服务器上有几个负载加高的站点,会导致服务器本身资源损耗严重反而影响站点的处理能力,第三步的Web Garden尤为明显。所以,应该持续压测、观察来找到一个较为适合我们服务器和站点结构的参数配置。

以下参考文档是对以上参数的释义及修改方法:

1、maxWorkerThreads、maxIoThreads

ASP.NET 使用以下两个配置设置来限制工作线程和完成线程所使用的最大数目︰

配置文件:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
修改参数: <processModel autoConfig="false" maxWorkerThreads="200" maxIoThreads="200" minWorkerThreads="100" />

MaxWorkerThreads参数和maxIoThreads参数隐式地乘以 Cpu 的数量。例如,如果您有两个处理器,是以下的最大工作线程数︰

2*maxWorkerThreads
 

2、minWorkerThreads

从 ASP.NET 1.0 Service Pack 3 和 ASP.NET 1.1 中,ASP.NET 还包含以下确定多少工作线程可能会使可立即用于远程请求提供服务的配置设置。

<processModel minWorkerThreads="1">

此设置控制的线程可以在更快的速度比从 CLR 的默认"线程优化"功能创建的辅助线程创建。可能突然填充 ASP.NET 请求队列的后端服务器上的 slow-down 由于此设置启用 ASP.NET 服务请求、 请求来自客户端,或其它类似突然爆发,会导致在队列中的请求数量突然上升。MinWorkerThreads参数的默认值为 1。我们建议您将minWorkerThreads参数的值设置为下面的值。

minWorkerThreads = maxWorkerThreads / 2

默认情况下,不存在 Web.config 文件或 Machine.config 文件中的minWorkerThreads参数。此设置隐式乘以

3、优化每个处理器限制对线程 ASP 属性的值(默认25,已修改成50)

ASP处理器限制每个线程属性指定的最大工作线程为每个 IIS 创建的处理器数。 之前的处理器使用率满足至少 50%或更高版本,应增加处理器限制每个线程的值。 此设置可能大大会影响 Web 应用程序的可伸缩性和服务器的性能通常。 因为此属性定义的最大可以同时执行的 ASP 请求数,此设置应保持为默认值,除非你 ASP 应用程序进行扩展的外部组件调用。 在这种情况下,可能会增加处理器限制每个线程的值。 这样做将使要创建更多的线程,以处理更多的并发请求的服务器。 处理器限制每个线程的默认值为 25。 此属性的最大建议的值为 100。

若要增加处理器限制每个线程的值,请执行以下步骤: 在连接窗格中,选择 web 服务器,请单击以选中功能视图,然后双击ASP功能。

  1. 单击启动,指向所有程序,单击管理工具,然后单击Internet Information Services (IIS) Manager.

  2. 在连接窗格中,选择 web 服务器,请单击以选中功能视图,然后双击ASP功能。

  3. 单击以展开限制属性下行为,单击处理器限制每个线程,输入所需的值线程每个处理器限制单击应用中操作窗格。

4、优化 ASP 队列长度属性的值(默认3000,已修改成30000)

优化此属性的目标是确保良好的响应时间,同时最小化 ASP 请求队列已满时,服务器频率发送到客户端的 HTTP 503 (服务器太忙) 错误。 如果 ASP 队列长度属性的值太低,则服务器将使用更高的频率发送 HTTP 503 错误。 如果 ASP 队列长度属性的值过高,所以用户可能会认为,服务器没有响应时实际上他们的请求正在等待队列中。 通过在高流量期间观看队列,你应识别 web 请求高峰和低谷的模式。 记下的峰值值,并设置正上方的峰值值 ASP 队列长度属性的值。 使用队列以处理短期峰值,请确保响应时间,并限制系统,从而避免重载时持续,出现意外的峰值。 如果你没有用于调整 ASP 队列长度属性的数据,将是很好的起点将队列一对一比率设置为线程的总数。 例如,如果每个处理器限制对线程 ASP 属性设为 25,具有四个处理器 (4 * 25 = 100 线程),将 ASP 队列长度属性设置为 100 并从该处优化。

若要增加队列长度的值属性,请按照下列步骤:

  1. 单击启动,指向所有程序,单击管理工具,然后单击Internet Information Services (IIS) Manager.

  2. 在连接窗格中,选择 Web 服务器,请单击以选中功能视图,然后双击ASP功能。

  3. 单击以展开限制属性下行为,单击队列长度,输入所需的值队列长度,然后单击应用中操作窗格

5、Web Garden

IIS默认配置下采用的是单工作进程的工作模式,也就是只启用一个w3wp.exe进程处理所有请求,然后进程内启用多个线程来处理并发请求,最大工作线程数由具体的操作系统和IIS来决定,当并发量大于线程数时则会让请求排队等待处理。这是面对高并发量,且部分请求处理耗时较长时就会造成大部分请求长期处于挂起的状态,直接反应就是慢或者超时。

参考链接:

https://support.microsoft.com/zh-cn/help/821268/contention--poor-performance--and-deadlocks-when-you-make-calls-to-web

https://docs.microsoft.com/zh-cn/biztalk/technical-guides/optimizing-iis-performance

http://www.cnblogs.com/tianguook/p/5204757.html

[转]IIS7.5优化--提高线程数来适应高并发的更多相关文章

  1. 提高线程数,解决redis超时问题

    根据压测结果做出的修改历史: 第一步:只针对maxWorkerThreads.maxIoThreads和minWorkerThreads做了修改<processModel autoConfig= ...

  2. linux 内核参数优化----最大线程数限制及当前线程数查询

    1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_p ...

  3. 性能测试:深入理解线程数,并发量,TPS,看这一篇就够了

    并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标. 那么他们之间究竟是怎样的一个对应关系和内在联系? 测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗? ...

  4. Java并发(八)计算线程池最佳线程数

    目录 一.理论分析 二.实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务.并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行.在高并发的情况下采用线程池,可以有 ...

  5. 百万级高并发mongodb集群性能数十倍提升优化实践

    背景 线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性.该集群采 ...

  6. .NET线程池最大线程数的限制-记一次IIS并发瓶颈

    .NET ThreadPool 最大线程数的限制 IIS并发瓶颈,有几个地方,IIS线程池的最大队列数,工作进程数,最大并发数.这些这里就不展开.主要是最近因为过度使用Task 导致的线程数占用过多, ...

  7. IIS并发瓶颈线程数的限制

    .NET线程池最大线程数的限制-记一次IIS并发瓶颈 https://www.cnblogs.com/7rhythm/p/9964543.html .NET ThreadPool 最大线程数的限制 I ...

  8. jmeter的线程数,并发用户数,TPS,RPS 关系解说

    背景 在做性能测试的时候,传统方式都是用并发虚拟用户数来衡量系统的性能(站在客户端视角),一般适用于一些网页站点例如首页.H5的压测:而RPS(Requests per second)模式主要是为了方 ...

  9. 跟着阿里p7一起学java高并发 - 第18天:玩转java线程池,这一篇就够了

    java中的线程池,这一篇就够了 java高并发系列第18篇文章. 本文主要内容 什么是线程池 线程池实现原理 线程池中常见的各种队列 自定义线程创建的工厂 常见的饱和策略 自定义饱和策略 线程池中两 ...

随机推荐

  1. (转)iOS平台UDID方案比较

    苹果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的获取给堵上了.没办法,毕竟人家是老大,说不让你用,你也没办法.   在这边总结一下现有的一部分 ...

  2. JAVA基础篇—异常

    五种常见异常 1.NullPointerException 空指针 2.ClassNotFoundException 指定类不存在 3.ArithmeticException运算异常 4.ArrayI ...

  3. Leetcode 75. 颜色分类

    题目链接 https://leetcode-cn.com/problems/sort-colors/description/ 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们 ...

  4. Linux操作系统启动流程

    一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步:1)开机BIOS自检,加载硬盘.2)读取MBR,进行MBR引导.3)grub引导菜单(Boot L ...

  5. STM8S与IAR程序常用错误

    一.IAR中的重复定义问题 在自己写头文件时,要记得将常量定义在.c文件中,如果将常量定义在.h文件中,当在main.c或者其他地方包含该头文件时,会将头文件中的常量定义包 含到main.c中,同时, ...

  6. Prolog&Epilog

    这篇博客会简单介绍一下Prolog&Epilog 然后再简单介绍下我对于程序在计算机中到底如何运行的一些理解(因为自己之前也从来没有接触过这些方面的知识,所以如果有讲的不对的地方希望大家能够帮 ...

  7. SPOJ QTREE6 Query on a tree VI 树链剖分

    题意: 给出一棵含有\(n(1 \leq n \leq 10^5)\)个节点的树,每个顶点只有两种颜色:黑色和白色. 一开始所有的点都是黑色,下面有两种共\(m(1 \leq n \leq 10^5) ...

  8. Python虚拟机函数机制之参数类别(三)

    参数类别 我们在Python虚拟机函数机制之无参调用(一)和Python虚拟机函数机制之名字空间(二)这两个章节中,分别PyFunctionObject对象和函数执行时的名字空间.本章,我们来剖析一下 ...

  9. luogu3376 【模板】网络最大流 dinic

    当前弧优化 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...

  10. const用法归纳总结 C++

    非常好的一篇分析const的总结归纳, 在此谢谢原作者:http://blog.csdn.net/zcf1002797280/article/details/7816977 在普通的非 const成员 ...