1.提升System.Net.ServicePointManager.DefaultConnectionLimit
2.提升最小工作线程数
.net mvc 在Application_Start(),.net core mvc 在Program.Main ,加入以下代码。
if (System.Net.ServicePointManager.DefaultConnectionLimit <= 300) { //DefaultConnectionLimit 桌面系统(如XP,WIN7,WIN11)默认是2,windows server 默认是4。 //当客户端访问你的程序,你的程序又要访问第三方的HTTP接口,DefaultConnectionLimit 需要调大。 System.Net.ServicePointManager.DefaultConnectionLimit = 300; } int workerThreads;//默认“最小工作线程数” int completePortsThreads; //默认“最小异步I/O 线程数” ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); int maxWork;//默认“最大工作线程数” int maxIOT;//默认“最大 IO线程数” ThreadPool.GetMaxThreads(out maxWork, out maxIOT); // wantWork 一般来说 50 - 300 就够用了,根据压力测试情况再加大。 int wantWork = 300; if (workerThreads < wantWork) { // 最小 IO线程数 值不要超过 默认“最大 IO线程数”,否则会不生效。如果需要调整的更高,先要调高“最大 IO线程数”。 ThreadPool.SetMinThreads(wantWork, wantWork); } ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);//重新获取一次默认值,看是否正确。 Console.WriteLine("workerThreads:"+ workerThreads.ToString()+ " completePortsThreads:"+ completePortsThreads.ToString());
------
DefaultConnectionLimit在asp.net mvc4中默认就是int.max ,不需要调整,若是不放心,判断下,然后加大。
DefaultConnectionLimit在asp.net core mvc 中默认比较小,需要加大。
使用ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); 方法可以得到当前“最小工作线程数”和“最小IO工作线程数”,这两个值默认等于CPU核心数,我这里等于6.
显然,这点并发处理能力是不够的。需要提升,一般50 - 300 就够用。
(最小 IO线程数 值不要超过 默认“最大 IO线程数”,否则会不生效。如果需要调整的更高,先要调高“最大 IO线程数”。)
在代码中加大(.net mvc 在Application_Start(),.net core mvc 在Program.Main ,只要在合适的时机调整即可):
以下是.net core 中运行的实际情况:
StringBuilder scLog = new StringBuilder(); try { scLog.AppendLine("默认的 System.Net.ServicePointManager.DefaultConnectionLimit:" + System.Net.ServicePointManager.DefaultConnectionLimit.ToString()); if (System.Net.ServicePointManager.DefaultConnectionLimit <= 300) { System.Net.ServicePointManager.DefaultConnectionLimit = 300; scLog.AppendLine("调整后 System.Net.ServicePointManager.DefaultConnectionLimit:" + System.Net.ServicePointManager.DefaultConnectionLimit.ToString()); } int workerThreads;//工作线程数 int completePortsThreads; //异步I/O 线程数 ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); string thMin = string.Format("默认的 最小工作线程数{0},最小IO工作线程数{1}", workerThreads, completePortsThreads); scLog.AppendLine(thMin); int maxT;//最大工作线程数 int maxIO;//最大IO工作线程数 ThreadPool.GetMaxThreads(out maxT, out maxIO); thMin = string.Format("默认的 最大工作线程数 {0},最大IO工作线程数{1}", maxT, maxIO); scLog.AppendLine(thMin); int blogCnt = 300; if (workerThreads < blogCnt) { ThreadPool.SetMinThreads(blogCnt, blogCnt); // MinThreads 值不要超过 (max_thread /2 ),否则会不生效。要不然就同时加大设置max_thread ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);//确认是否修改成功 thMin = string.Format("调整后 最小工作线程数{0},最小IO工作线程数{1}", workerThreads, completePortsThreads); scLog.AppendLine(thMin); } ThreadPool.GetMaxThreads(out maxT, out maxIO); thMin = string.Format("再看一次 最大工作线程数 {0},最大IO工作线程数{1}", maxT, maxIO); scLog.AppendLine(thMin); } catch (Exception ex) { scLog.AppendLine("index ex:" + ex.Message); } // mylog scLog.ToString()
结果:
默认的 System.Net.ServicePointManager.DefaultConnectionLimit:2 调整后 System.Net.ServicePointManager.DefaultConnectionLimit:300 默认的 最小工作线程数6,最小IO工作线程数6 默认的 最大工作线程数 32767,最大IO工作线程数1000 调整后 最小工作线程数300,最小IO工作线程数300 再看一次 最大工作线程数 32767,最大IO工作线程数1000
其它:
asp.net mvc 也可以在machine.config 中加大。