IdentityServer4 / Newtonsoft.Json

时间:2017-08-30 09:08:56

标签: c# json.net profiler identityserver4 azure-application-insights

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

Overview of request performance

我已启用新Application Insights profiling,大多数慢速跟踪如下所示:

Profiler trace of a slow operation

正如Application Insights profiler page所说:

  

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

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

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

1 个答案:

答案 0 :(得分:3)

查看信息,您的所有请求大约是3222毫秒,直到您开始序列化您的JSON。 当您开始将数据序列化为json JSON时,请求会跳转到5589 ms,当您反序列化它时会跳转到8811 ms。

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

问题在于你正在获取大量数据,大概是编译器在序列化和反序列化数据时会受到惩罚,这两种操作都非常昂贵。

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

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

这是你的关键。