.NET ThreadPool 最大线程数的限制

IIS并发瓶颈,有几个地方,IIS线程池的最大队列数,工作进程数,最大并发数。这些这里就不展开。主要是最近因为过度使用Task 导致的线程数占用过多,所以实验了一下 .net线程池 的限制,分享一下。

注意IIS线程池与.NET线程池不是同一个东西,下面详解。

W3 Thread Pool(W3TP)

当处于内核模式的http.sys接收到来自用户的请求之后,会将请求放入队列中。那处于用户模式的w3wp进程如何从内核模式的队列中取出请求呢?

w3wp中有专门干这个的——w3dt+w3tp。

当请求被w3tp通过w3dt从http.sys的队列中取出来后,接下来的工作就会转交给ASP.NET,线程池——.NET Thread Pool。

为了检验.net 线程池 最大线程数的限制,在MVC中新增一个Action 如下

每个task sleep 1s ,这样线程池就会被占用最多20W条线程。

设置.net线程池 的配置文件位置

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

64位系统:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config

找到这个节点 processModel

设置maxWorkerThreads =20

autoConfig=false (win10默认是true)

访问地址:/home/TestTaskLimitCount  时

使用工具集 SysinternalsSuite procexp64.exe 查看系统进程的详细信息

看到W3WP.EXE 这里的总线程数卡在100左右,因为我这里的4个CPU,所以maxWorkerThreads *CPUCOUNT =80  另外的27条线程可能是IIS线程池里的。

然后当我们同时访问该站点其他URL时,全部都在一直在等待了。

OK,重新改为

maxWorkerThreads =200

这个时候重新启动站点,运行/home/TestTaskLimitCount 时,看到线程数很快累加到400-500之间,这个时候线程池并没有被用满,只是有些Task任务结束后丢回线程池后又被重新启用。

同时再次访问一下该站点其他URL,发现虽然加载速度稍有缓慢,但是OK没问题的。

这个值(WorkerThreads)最好根据机器性能自行配置,一般100左右,minWorkerThreads 也很重要,因为开启线程的速度其实还挺慢的,每秒可以开启几条而已,所以预先设置好minWorkerThreads,可以预防一些突发流量。

.NET线程池最大线程数的限制-记一次IIS并发瓶颈的更多相关文章

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

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

  2. 由浅入深理解Java线程池及线程池的如何使用

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  3. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  4. Java多线程系列 JUC线程池03 线程池原理解析(二)

    转载  http://www.cnblogs.com/skywang12345/p/3509954.html  http://www.cnblogs.com/skywang12345/p/351294 ...

  5. Java多线程系列 JUC线程池02 线程池原理解析(一)

    转载  http://www.cnblogs.com/skywang12345/p/3509960.html ; http://www.cnblogs.com/skywang12345/p/35099 ...

  6. Java多线程系列 JUC线程池01 线程池框架

    转载  http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...

  7. 异步线程编程,线程池,线程组,后面涉及ThreadLocal在理解

    join模拟订单 package com.future.demo.future; /** * * * @author Administrator * */ public class NormalThr ...

  8. java并发编程(十七)----(线程池)java线程池架构和原理

    前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类.我们先从他开始分析 ...

  9. java并发编程(十五)----(线程池)java线程池简介

    好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...

随机推荐

  1. lombok学习

    lombok的官方地址:https://projectlombok.org/ lombok的Github地址:https://github.com/rzwitserloot/lombok lombok ...

  2. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  3. 网页偶现性崩溃-chrome

    简介: 项目前台框架:Angular2 + Bootstrap(日期等组件) + Echarts + 响应式(包括页面.字体缩放:rem) chrome版本:多个版本测试均有此问题. 表现: 订单详情 ...

  4. require()  module.export    Object.keys()

    import API from"../../api/api.js";   var data = require('../../utils/data.js').songs;   // ...

  5. 基于UML的时空建模

    一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...

  6. -实现 LFU 缓存算法

    -实现 LFU 缓存算法, 设计一个类 LFUCache,实现下面三个函数 + 构造函数: 传入 Cache 内最多能存储的 key 的数量 + get(key):如果 Cache 中存在该 key, ...

  7. js-图片轮播(极简)

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  8. day20_雷神_django第三天

    django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...

  9. MySQL优化--INSERT ON DUPLICATE UPDATE死锁

    INSERT ON DUPLICATE UPDATE与死锁 在MySQL中提供两种插入更新的方式:REPLACE INTO和INSERT ON DUPLICATE UPDATE,简化了“存在则更新,不 ...

  10. 浅析B/S架构数据库连接方式

    前言 在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?   目录 1.普通连接方式 2.单例模式 3.连接池   分析 普通连接: 下面是我们 ...