Профайлер BLOCKED_TIME в IdentityServer4/Newtonsoft.Json

У меня возникают проблемы с конечной точкой /connect/introspect моего IdentityServer, иногда очень медленной (10 секунд для одного вызова). Как вы можете видеть ниже, большинство вызовов (18k) выполняются быстро (< 250 мс).

Обзор производительности запроса

Я включил новый профиль профайла приложений, и большинство медленных трасс выглядит следующим образом:

Трассировка профайлера медленной операции

Как сказано на странице "Статистика профайлов приложений" :

BLOCKED_TIME указывает, что код ожидает другого ресурса быть доступным, например, ждать объекта синхронизации, ждать для того, чтобы поток был доступен или ожидал завершения запроса.

Но у меня нет причин полагать, что это должно что-то ждать. В запросах нет всплесков, поэтому я не думаю, что доступных потоков нет или что-то еще. Память, по-видимому, не проблема для нашего плана обслуживания приложений, поскольку она всегда составляет около 40%. Я также выкопал источник IdentityServer4, но не смог определить причину этого. Так что теперь я застрял. Может ли кто-нибудь указать мне на возможные причины этих медленных запросов? Или указать мне в правильном направлении, чтобы определить причину? Любая помощь будет высоко оценена!

Изменить с дополнительной информацией: мы используем IdentityServer4.EntityFramework для хранения токенов ссылок в sql azure db. Я просмотрел Application Insights, и запросы в этих медленных запросах выполняются менее чем за 50 мс. Поэтому я предполагаю, что это не база данных.

Ответ 1

Посмотрите на информацию. Все ваши запросы составляют около 3222 мс, пока вы не начнете сериализовать свой JSON. Когда вы начинаете сериализовать свои данные в json JSON, запрос перескакивает до 5589 мс, когда вы десериализуете его, он перескакивает до 8811мс.

Проблема здесь не в БД, БД может получить данные достаточно быстро. Не всплеск в запросе, которого у вас нет, или проблема с памятью, которая не существует.

Проблема заключается в том, что вы извлекаете много данных, предположительно, и у компилятора есть штраф при сериализации и десериализации данных, причем оба этих действия довольно дорогостоящие.

Вы должны упорядочить свой список как JSON, а затем десериализовать его в объект, к которому вы можете получить доступ снова.

Посмотрите, что происходит между этими вызовами, количеством данных, которые вы сериализуете и десериализуете, и что происходит после.

Это ваш ключ.