.netcore-线程池饿死问题分析(CPU空闲,并发量大时请求排队)

本文分析了.NET Core服务在并发量大时CPU利用率低下的问题,即线程池饿死现象。介绍了线程池、异步编程的概念,以及导致线程池饿死的常见原因,如阻塞API的使用。通过PerfView工具可以发现线程增长和阻塞API,建议避免阻塞和使用异步API以优化服务性能。同时,提供了通过设置ThreadPool最小线程数的临时解决方案。

如果您是使用.net或.net core平台编写服务时服务负载能力已经达到顶峰,而CPU并没有得到充分利用,看看这篇文章,那么或许你可以得到一些启发。

目录

1、问题现象
2、线程数不够
3、什么是线程池
4、什么是异步编程?
5、通常是什么导致阻塞?
6、我怎么知道ThreadPool缺少线程?
6.1、PerfView / threadTime收集
6.2、寻找增长的线程数。
6.3、查找阻塞API
6.4、主动出击
6.5、 解决方法:在ThreadPool中强制使用更多线程
7、小结

1、问题现象
有一个api网关,采用的是.net core 2.1开发,其并发量达到一定程度时再难以上升,此时分析瓶颈存在哪里,在之前已经有所猜测,此处也算是证实下猜想。
在这里插入图片描述
本接口仅仅访问了redis、速度应该很快,然而并发达到300左右,已经卡成翔了。

2、线程数不够
有一种情况,那就是除了其他的I/O慢外,就是线程资源不够。当执行并发操作时,没有线程可以运行下一步来处理该请求,因此它只是停顿,等待此类线程可用。这段时间显示为“更长的”IO查询或处理,但是它发生时其实没有任何非CPU活动发生,因此,此类问题被称为ThreadPool饥饿,这是本文的重点。

3、什么是线程池
在讨论线程池之前,我们应该返回并描述什么是线程。
线程是执行顺序程序的最小单位,包括执行方法的“调用堆栈”,以及每个方法的所有局部变量。核心点是所有代码都需要线程才能“运行”。程序启动时,将被分配一个线程,多线程程序会创建其他线程,每个线程彼此同时执行代码。
在并发程度适中的世界中,线程是有意义的,每个线程都在执行复杂的操作。
但是,某些工作负载具有完全相反的特征:发生了许多并发事件,并且每个工作都在做简单的事情。由于所有执行都需要一个线程,因此对于这种工作负载,重用该线程很有意义,因为它可以执行许多小的(不相关的)工作项。这就是线程池的来历,它有一个非常简单的API。在.NET中,ThreadPool.QueueUser

当用户在尝试运行 `dotnet watch` 命令遇到错误,提示无法找到项目文件 'VOL.WebApi.csproj',这通常意味着命令行工具无法定位到正确的项目文件路径。以下是解决此问题的几种方法: 1. **确认当前目录是否正确** 确保你在包含 `VOL.WebApi.csproj` 文件的项目目录中执行命令。可以通过 `ls`(Linux/macOS)或 `dir`(Windows)命令检查当前目录下是否存在该项目文件。 2. **使用完整路径指定项目文件** 如果当前目录不包含项目文件,可以尝试使用项目的完整路径来运行命令。例如: ```bash dotnet watch --project /path/to/your/project/VOL.WebApi.csproj ``` 3. **检查项目文件是否存在拼写错误** 确认项目文件名是否准确无误,包括小写和扩展名 `.csproj`。 4. **确保项目已成功加载并构建** 在某些情况下,如果项目未能正确加载或存在构建错误,也可能导致 `dotnet watch` 无法识别项目文件。尝试先运行 `dotnet build` 来验证项目是否能够正常构建 [^1]。 5. **清理和恢复 NuGet 包** 有候,NuGet 缓存的问题可能导致项目加载失败。你可以尝试清除缓存并重新恢复包: ```bash dotnet nuget locals all --clear dotnet restore ``` 6. **检查全局工具是否安装正确** `dotnet watch` 是一个全局工具,需要确保它已经被正确安装。可以通过以下命令检查其版本: ```bash dotnet tool list -g ``` 如果未列出 `Microsoft.DotNet.Watcher.Tools`,则需要安装它: ```bash dotnet tool install --global Microsoft.DotNet.Watcher.Tools ``` 7. **检查 .NET SDK 是否安装正确** 确保你的机器上已经安装了正确的 .NET SDK 版本,并且环境变量配置正确。可以通过以下命令查看已安装的 SDK 列表: ```bash dotnet --list-sdks ``` 通过上述步骤,应该可以解决 `dotnet watch` 找不到项目文件的问题。如果仍然存在问题,请提供具体的错误信息以便进一步诊断。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值