asp dotnet core 记一次应用拒绝响应调试 开启线程等待同步用光线程池

在ASP.NET Core应用中,由于日志服务挂掉导致线程池耗尽,使得应用拒绝响应。通过Visual Studio的并行堆栈工具发现大量线程在等待同步IO操作。避免使用Task.Run进行同步调用,尤其是处理网络请求时,应改为异步方法,减少线程池压力。优化措施包括检查并移除不必要的Task.Run,利用异步IO,或使用生产者消费者队列处理低优先级任务。

我有一个上古的库,我使用这个库用来上报日志,而刚才日志服务挂了。然后我就发现了我的应用拒绝响应了,通过 VisualStudio 断点调试可以发现线程池的线程全部被占用了。因为没有可用线程因此所有对 asp dotnet core 应用的访问全部都不会收到响应,为什么我的另一个应用日志服务挂了会让我的业务应用拒绝响应?为什么我的业务应用会使用线程池所有的线程,为什么线程池的所有线程被占用将会让应用拒绝响应

很好复现这个坑,在开始复现之前,需要聊一下背景

我有一个业务应用和一个日志服务,基本上可以认为日志服务和业务没有任何关联,而且我从上层业务调用可以看到,都是异步使用。而在日志服务全部挂掉的时候,开始业务应用还能使用,但是当请求大概访问了 100 次,就发现后续的访问都没有任何返回。同时在业务应用的本机控制台和日志文件里面都没有任何记录,而控制台也没有收到 50x 等错误,也就是业务应用还在工作,但是没有任何响应

我在本地上可以复现,使用 VisualStudio 开启所有异常,也什么都没收到。在应用配置文件 appsettings.json 文件里面将日志配置设置为 Debug 也没有拿到任何有用的信息

原本每次的请求都会在默认的 asp dotnet core 日志输出至少一条日志,但是此时什么日志都没有输出

而此时的业务应用的 cpu 和内存占用都很少,在没有请求的时候,可以看到 cpu 几乎没有占用

在点击 VisualStudio 暂停的时候,可以看到业务应用创建了大量的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值