12

私のIdentityServerの/ connect/introspectエンドポイントが時には非常に遅い(1回の呼び出しで10秒)という問題があります。以下に示すように、ほとんどのコール(18k)はすぐに実行されます(< 250ms)。IdentityServer4/Newtonsoft.JsonのProfiler BLOCKED_TIME

Overview of request performance

私は新しいApplication Insights profilingを有効にして、ゆっくりとトレースのほとんどは、次のようになります。

Profiler trace of a slow operation

としてはApplication Insights profiler pageに言った:

BLOCKED_TIMEが示しますコードが への別のリソースを待っています。 uchが同期オブジェクトを待つこと、スレッドが利用可能になるのを待つこと、または要求が完了するのを待つこと。

しかし、私はこれが何かを待っていると信じる理由はありません。要求が急増しているわけではないので、利用できるスレッドがないとは思えません。メモリは、常に約40%であるため、Googleのアプリサービスプランには問題ありません。私もIdentityServer4のソースを掘り下げましたが、これの原因を特定できませんでした。だから今私はちょっと固まっている。誰も私にこれらの遅い要求の原因を教えてもらえますか?原因を特定するのに良い方向に向いていますか?どんな助けでも大歓迎です!

いくつかの追加情報で編集:IdentityServer4.EntityFrameworkを使用して、参照トークンをSQL Azureデータベースに格納します。私はApplication Insightを見てきましたが、遅い要求のクエリは50ms未満で実行されます。だから私はそれがデータベースではないと推測しています。

+0

コールのカウントだけでなく、プロファイル結果の時間も表示できますか? – dbc

+0

私はコールカウントを表示するオプションが表示されませんが、それはトークンを一度しかシリアル化しないので、あまりないと思います。 – Zenuka

答えて

2

あなたのすべてのリクエストは約3222ミリ秒で、JSONのシリアル化を開始するまで続きます。 json JSONへのデータのシリアル化を開始すると、要求が最大5589ミリ秒にジャンプします。デシリアライズすると、8811ミリ秒にジャンプします。

ここで問題となるのはDBではなく、データが十分に速く取得される可能性があります。あなたの持っていないリクエストのスパイクや、存在しないメモリの問題ではありません。

多くのデータをフェッチしていて、データのシリアライズとデシリアライズ時にコンパイラがペナルティを被るという問題があります。この両方の処理にはかなりのコストがかかります。

JSONとしてリストを整理し、再度アクセスできるオブジェクトに逆シリアル化する必要があります。

これらの呼び出しの間に何が起こるか、シリアル化およびデシリアライズするデータの量とその後の処理を見てください。

これはあなたの鍵です。

+0

私はデータベース内で最大のトークンを検索して100回シリアライズし、平均(100回のシリアライズの合計)は約100msです。だから私はこれがどのように問題になるかは分かりません。最大のトークンは33581文字です。私はあなたの答えに何かを見逃していますか?シリアライズとデシリアライズは同期的でなければなりませんか?それはブロックされた時間の権利を説明していないのですか? – Zenuka

関連する問題