我遇到的问题是我的IdentityServer的/ connect / introspect端点有时非常慢(一次调用10秒)。如下所示,大多数调用(18k)都能快速执行(<250ms)。
我已启用新Application Insights profiling,大多数慢速跟踪如下所示:
正如Application Insights profiler page所说:
BLOCKED_TIME
表示代码正在等待另一个资源 可用,例如等待同步对象,等待 一个线程可用,或等待请求完成。
但我没有理由相信这应该等待一些事情。请求没有高峰,所以我认为没有线程可用或其他东西。内存似乎对我们的应用服务计划没有问题,因为它总是大约40%。我也挖掘了IdentityServer4的来源,但无法找出原因。所以现在我有点卡住了。有人能指出这些缓慢请求的可能原因吗?或者指出我确定原因的好方向?任何帮助将不胜感激!
使用一些额外信息进行编辑:我们使用IdentityServer4.EntityFramework在sql azure db中存储引用令牌。我查看了Application Insights,这些慢速请求中的查询执行时间不到50毫秒。所以我猜测它不是数据库。
答案 0 :(得分:3)
查看信息,您的所有请求大约是3222毫秒,直到您开始序列化您的JSON。 当您开始将数据序列化为json JSON时,请求会跳转到5589 ms,当您反序列化它时会跳转到8811 ms。
这里的问题不是数据库,数据库可能足够快地获取数据。不是请求中的峰值,也不是您没有的,也不存在不存在的内存问题。
问题在于你正在获取大量数据,大概是编译器在序列化和反序列化数据时会受到惩罚,这两种操作都非常昂贵。
您必须将列表排列为JSON,然后将其反序列化为可以再次访问的对象。
查看这些调用之间发生的情况,序列化和反序列化的数据量以及之后发生的情况。
这是你的关键。