multithreading - 如何解决心跳超过“00:00:01”失败?
问题描述
我有一个执行 HTTP POST 的 .NetCore C# 项目。该项目是在 Kubernetes 中设置的,我注意到以下日志:
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:45 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:46 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:47 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:48 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:49 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:50 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:51 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:52 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:53 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:54 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:55 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:43:56 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:44:33 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:44:34 +00:00".
warn: Microsoft.AspNetCore.Server.Kestrel[22]
Heartbeat took longer than "00:00:01" at "02/22/2020 15:44:35 +00:00".
经过一些初步研究,这似乎是线程池饥饿的常见结果。因此,去年 11 月,我将帖子设为异步,并将 Max threads 和 Available threads 记录如下以用于监控目的:
ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
ThreadPool.GetAvailableThreads(out int workerThreadAvailable, out int completionPortThreadsAvailable);
_log.Info(new { message = $"Max threads = {workerThreads} and Available threads = {workerThreadAvailable}" });
在过去的几个月中,日志始终显示:Max threads = 32767 和 Available threads = 32766。这似乎很好,但是,我注意到同样的心跳错误,所以想知道这是否真的是线程池饥饿问题。可能有人知道发生了什么,如果这个错误实际上是由其他原因引起的?对此的任何调查/解决提示将不胜感激!
解决方案
推荐阅读
- sql-server - MS SQL Server 从 sys.sql_dependencies 获取引用对象的 db_name()
- security - 保护网站内容免受虚假注册
- python - GCE 如何在谷歌 TPU 中使用 ImageDataGenerator
- reactjs - React & Redux : cannot read property of undefined
- sql - AWS Redshift SQL 使用查询结果执行另一个查询
- c# - 是否可以使用 DataTrigger 设置组合框的 SourceItem?
- java - Kotlin 与 android java 在 Dalvik VM 上的工作
- python - 与熊猫的“枢轴”操作完全相反
- sql - 从另一个表更新一个表做一些数学
- html - 无法为个人资料图片裁剪图像的特定部分