我有一个上古的库,我使用这个库用来上报日志,而刚才日志服务挂了。然后我就发现了我的应用拒绝响应了,通过 VisualStudio 断点调试可以发现线程池的线程全部被占用了。因为没有可用线程因此所有对 asp dotnet core 应用的访问全部都不会收到响应,为什么我的另一个应用日志服务挂了会让我的业务应用拒绝响应?为什么我的业务应用会使用线程池所有的线程,为什么线程池的所有线程被占用将会让应用拒绝响应
很好复现这个坑,在开始复现之前,需要聊一下背景
我有一个业务应用和一个日志服务,基本上可以认为日志服务和业务没有任何关联,而且我从上层业务调用可以看到,都是异步使用。而在日志服务全部挂掉的时候,开始业务应用还能使用,但是当请求大概访问了 100 次,就发现后续的访问都没有任何返回。同时在业务应用的本机控制台和日志文件里面都没有任何记录,而控制台也没有收到 50x 等错误,也就是业务应用还在工作,但是没有任何响应
我在本地上可以复现,使用 VisualStudio 开启所有异常,也什么都没收到。在应用配置文件 appsettings.json 文件里面将日志配置设置为 Debug 也没有拿到任何有用的信息
原本每次的请求都会在默认的 asp dotnet core 日志输出至少一条日志,但是此时什么日志都没有输出
而此时的业务应用的 cpu 和内存占用都很少,在没有请求的时候,可以看到 cpu 几乎没有占用
在点击 VisualStudio 暂停的时候,可以看到业务应用创建了大量的线程

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

被折叠的 条评论
为什么被折叠?



