最近忙于系统的优化,同时也涉及到.net 线程池,关于.net 线程池的介绍很多,但在使用的过程中发现一些问题,和MSDN、网上介绍的并不一致:
一、线程池的默认设置
先看看微软官方的说法:
requestQueueLimit 默认值为 5000。
jeffer richer 说明
.net 2.0 每CPU25个线程,同时不建议修改默认配置 ,而且网上很多人也认为是25个,但我没有测出这个结果.
我测试的情况:
我机器为双核 ,autoconfig="true"
windows Application :
最大线程数: 500
最小
最大IO数:1000
web Application:
最大线程数为:200
最大IO数:1000
测试方法:
说明:根据测试的确最小线程数和MSDN上所述一致,默认为1;但最大线程数应该为:windows应用(cpu数*250),web应用(cpu数*100) ,所以如果autoconfig="true" 最大线程数并不是20,也不是25,而是100,在不同的机器上测试的结果一致。
二、优化的意义
按照官方的说法,线程的创建要耗费大量的系统资源,所以当用户访问量极大时,应该提高minWorkerThreads数和其它的配置, 将autoconfig="false"
修改为假,同时指定maxWorkerThreads="20" minWorkerThreads="10" ,同时在上述代码中将线程休眠5秒,压500并发,在测试的后半段发现可用线程数(最大线程数-已用线程数)达到9个左右,当停止并发后,要过一段可用线程数才能恢复,本来认为设定范围较大,又进行了重新设置将maxWorkerThreads="10" minWorkerThredad="5",又压了一次,发现可用线程数维持在7左右,并没有耗尽,所以初步认为ThreadPool内部有自己的保护机制,可用线程数要预留一定数量以应对其它的处理。