博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

也谈.net线程池

Posted on 2011-02-28 21:12  codingsilence  阅读(292)  评论(0编辑  收藏  举报

最近忙于系统的优化,同时也涉及到.net 线程池,关于.net 线程池的介绍很多,但在使用的过程中发现一些问题,和MSDN、网上介绍的并不一致:

 一、线程池的默认设置

先看看微软官方的说法:

maxIoThreads 默认值为 20。该属性的范围是从 5 到 100。
maxWorkerThreads 默认值为 20。该属性的范围是从 5 到 100。
minIoThreads  默认值为 1。
minWorkerThreads 默认值为 1。

requestQueueLimit 默认值为 5000。 

 

jeffer richer 说明

.net 2.0 每CPU25个线程,同时不建议修改默认配置 ,而且网上很多人也认为是25个,但我没有测出这个结果.

 

 我测试的情况:

我机器为双核 ,autoconfig="true"

windows Application :

最大线程数: 500

最小 

最大IO数:1000 

 

web Application:

最大线程数为:200

最大IO数:1000 

测试方法:

 

        int i = 0;
        int j = 0;
        System.Diagnostics.Stopwatch watch = new Stopwatch();
        watch.Start();
       
        ThreadPool.GetMaxThreads(out i, out j);
 
        Response.Write("最大工作线程"+i.ToString() + "/r/n");
        ThreadPool.GetMinThreads(out i, out j);
        Response.Write("最小工作线程" + i.ToString() + "/r/n");
       
        
        ThreadPool.GetAvailableThreads(out i, out j);
        
        Response.Write("可用线程:"+i.ToString()+"/r/n");
        Thread.Sleep(5000);
        watch.Stop();
        decimal tim = watch.Elapsed.Ticks / 10m;
        Response.Write("花费时间为:" + tim.ToString());

 

 

说明:根据测试的确最小线程数和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内部有自己的保护机制,可用线程数要预留一定数量以应对其它的处理。