我正在一个“突发的” Asp.Net Core 2.2站点上工作,在该站点中,我们有很长的可预测负载,但是偶尔会有大量流量。在其中一些突发之后,其中一台服务器将变得痉挛,并一直保持尽可能快地向线程池添加线程(每秒约1个),直到达到大约32k线程的最大值(我们通常使用约40个工作线程运行) ,因此32k似乎过多),然后变得无响应
据我了解,问题在于我们在大多数异步代码库中都进行了一些线程阻塞,并且我猜想如果所有线程同时被阻塞,我们将进入一种不良状态,在这种状态下,新线程被缓慢添加并开始处理新的流量(不断涌入),而不是帮忙阻塞的线程,直到它们自己被阻塞为止,因为新线程仅以大约1每秒的速度滴入,我们永远不会获得足够数量的空闲线程,因此它们可以释放任何线程越来越多的阻塞线程。
现在,我尝试了我最胆小的跟踪代码中我们同步的所有地方并将其替换为异步,我使用了Ben Adams阻塞检测器,我尝试在线程池中仅使用1个工作线程运行,以查看网站挂起,我将Kestrel设置为禁止对请求/响应进行同步操作,并且我相信我已经删除了自己代码中的所有罪魁祸首,但是对于api-operation,我们使用JSON-body中的asp.net核心模型绑定, InvalidOperationException:
“不允许执行同步操作。调用ReadAsync或设置 而是将AllowSynchronousIO设为true。”
with stacktrace:
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at Microsoft.AspNetCore.WebUtilities.HttpRequestStreamReader.ReadIntoBuffer()
at Microsoft.AspNetCore.WebUtilities.HttpRequestStreamReader.Read(Char[] buffer, Int32 index, Int32 count)
at Newtonsoft.Json.JsonTextReader.ReadData(Boolean append, Int32 charsRequired)
at Newtonsoft.Json.JsonTextReader.ParseValue()
at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)--- End of stack trace from previous location where exception was thrown ---
...
at Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatter.<ReadRequestBodyAsync>d__17.MoveNext()--- End of stack trace from previous location where exception was thrown ---
...
at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.<BindModelAsync>d__7.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
这可能是问题吗?我们如何获得Asp.Net Core 2.2的异步json模型绑定