也谈.net线程池

    技术2022-05-20  34

    最近忙于系统的优化,同时也涉及到.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内部有自己的保护机制,可用线程数要预留一定数量以应对其它的处理。

     


    最新回复(0)