news 2026/6/11 19:31:39

【压测数据分享】C#的 `ThreadPool.SetMaxThreads()` 配置最大线程数到底对性能有多大影响

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【压测数据分享】C#的 `ThreadPool.SetMaxThreads()` 配置最大线程数到底对性能有多大影响

结论

先说结论:

以 async 的方法 + kestrel 库来提供 http 服务,性能非常强悍。直观感受上,性能不输 golang.

物理线程的数量必然影响性能:

ThreadPool.SetMinThreads( 4,4) ThreadPool.SetMaxThreads(4,4) 线程池的线程数与核数一致时,性能最好。(CPU 占用达到 360%)

不限制线程池的最大和最小线程数,性能下降约 1.37%。猜测在任务更复杂的情况下,下降的比例会更明显。(CPU 占用达到 360%)

ThreadPool.SetMinThreads( 2,2) ThreadPool.SetMaxThreads(2,2) 当线程池最大值只有核数的一半时,性能下降 51.07% (CPU 占用达到 215%)

程序中宜限制线程池最大线程数不要超过核数,否则一定产生劣化影响。

从稳定性考虑:线程池最大值 = 核数 - 1 是个好主意。

某些特定任务可以开额外的线程来运行

负责处理请求的线程数稳定,不至于在过载的时候完全卡死整个应用。

最重要的:kestrel 的处理路径上完全 async,没有阻塞!

实验方法

使用 DotNet 的 Kestrel 库开发一个 http 1.1 的 echo 服务器(请求后,把请求头作为输出)

使用了自定义的 metrics 统计方式

往 stdout 输出了 json 格式的请求流水日志

编译为 linux 下的二进制程序

编译参数如下:

dotnet publish $(PROJECT) -c Release -r linux-x64 -p:PublishAot=true --self-contained true -o $(PUBLISH_DIR)

在基础镜像 mcr.microsoft.com/dotnet/aspnet:8.0 中运行

docker 运行时绑定到固定的 cpu 上:

使用 4 个 cpu 核

docker run \

-d \

--name=kestrel_exp_0 \

--rm \

--cpuset-cpus="8,9,10,11" \

-m 1G \

-p 8081:8081 \

kestrel-server:latest \

/app/KestrelServer -addr=0.0.0.0:8081 -threadpool.min=4 -threadpool.max=4

关键实验代码如下:

if (minThreads > 0)

{

ThreadPool.SetMinThreads(minThreads, minThreads);

}

if (maxThreads > 0)

{

ThreadPool.SetMaxThreads(maxThreads, maxThreads);

}

实验数据:

qps CPU

Threadpool.MaxThread = 核数 88594.4 / core / s 360%

Threadpool.MaxThread 不限制 87164.7 / core / s 360%

Threadpool.MaxThread = 核数 / 2 58645.8 / core / s 215.70%

Threadpool.MaxThread = 核数 * 2 81888.8 / core / s 315%

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 15:18:44

告别手工拷贝!一套轻量级多账套数据同步方案,让财务也能自助分析

“100个数据库,50套账,每次做集团合并分析都要手动导Excel、拼表、核对……” 这不是个例,而是众多集团企业财务和数据分析团队的日常痛点。 本文分享一套面向业务用户的轻量级数据同步系统设计思路与落地实践——无需写 SQL、不用依赖 IT 开…

作者头像 李华
网站建设 2026/6/11 13:26:59

LobeChat能否实现对话置顶?重要会话管理技巧

LobeChat能否实现对话置顶?重要会话管理技巧 在如今AI助手深度融入日常工作的背景下,用户与大语言模型的交互已从“临时问答”演变为“持续协作”。无论是撰写技术文档、策划营销方案,还是处理客户合同,一次关键对话往往需要反复查…

作者头像 李华
网站建设 2026/6/10 14:24:28

使用C#编写微信小程序(3)单元测试

单元测试使用C#的单元测试,一切与C#无关的平台统一使用接口,通过依赖注入和mock使用案例: 微信小程序Storage单元测试using System.Text.Json; using System.Threading.Tasks; using TsRoslyn.Core.Api; using TsRoslyn.Razor.Core; using XieYun.Applic…

作者头像 李华
网站建设 2026/6/10 1:50:20

直流耦合1G采集卡

1GS/s采样率 14bit分辨率 1/2/4通道同步采集,高采样率(1GS/s)与高分辨率(14bit)的高速数字化仪/高速数据采集卡。集成直流耦合程控放大器,支持双极性宽带信号输入,具备高动态范围采集能力。该…

作者头像 李华
网站建设 2026/6/11 12:47:52

大模型压缩技术全解析:从剪枝到量化,程序员必学收藏指南

本文详细介绍了大模型压缩技术,包括剪枝(移除冗余连接)、量化(降低数值精度)和知识蒸馏(教师-学生模式)三大核心方法,并推荐了"知识蒸馏→剪枝→量化"的组合优化流程。通过系统压缩技术,可将庞大模型转化为轻量化模型,实…

作者头像 李华
网站建设 2026/6/10 14:25:33

LC.701 | 二叉搜索树中的插入操作 | 树 | 迭代模拟

输入&#xff1a; 二叉搜索树的根节点 root 和一个待插入的整数 val。 要求&#xff1a; 将 val 插入到二叉搜索树中&#xff0c;并保证插入后整棵树仍然满足 BST 的性质&#xff08;左 < 根 < 右&#xff09;。 题目保证新值和原始树中任意节点值都不同。 输出&#xff…

作者头像 李华