IdentityServer4/Newtonsoft.Json中的Profiler BLOCKED_TIME

Zen*_*uka 13 c# profiler json.net azure-application-insights identityserver4

我遇到的问题是我的IdentityServer的/ connect/introspect端点有时真的很慢(一次调用10秒).如下所示,大多数呼叫(18k)快速执行(<250ms).

请求性能概述

我启用了新的Application Insights分析,大多数慢速跟踪如下所示:

Profiler跟踪缓慢操作

正如Application Insights剖析器页面上所述:

BLOCKED_TIME 表示代码正在等待另一个资源可用,例如等待同步对象,等待线程可用或等待请求完成.

但我没有理由相信这应该等待一些事情.请求中没有高峰,因此我认为没有可用的线程或其他东西.内存似乎对我们的应用服务计划没有问题,因为它总是大约40%.我也挖掘了IdentityServer4的来源,但无法确定任何原因.所以现在我有点卡住了.有人能指出这些缓慢请求的可能原因吗?或者指出我确定原因的好方向?任何帮助都感激不尽!

使用一些额外信息进行编辑:我们使用IdentityServer4.EntityFramework在sql azure db中存储引用令牌.我查看了Application Insights,这些慢速请求中的查询执行时间不到50毫秒.所以我猜它不是数据库.

Bar*_*r J 4

查看信息,您的所有请求都在 3222 毫秒左右,直到您开始序列化 JSON。当您开始将数据序列化为 json JSON 时,请求会跳至 5589 毫秒,当您反序列化时,请求会跳至 8811 毫秒。

这里的问题不是数据库,数据库可能足够快地获取数据。不是请求中的峰值(您没有),也不是不存在的内存问题。

问题在于,您正在获取大量数据,大概编译器在序列化和反序列化数据时会受到惩罚,这两种操作的成本都相当高。

您必须将列表排列为 JSON,然后将其反序列化为可以再次访问的对象。

查看这些调用之间发生的情况、序列化和反序列化的数据量以及之后发生的情况。

那是你的钥匙。