12

Tôi gặp sự cố rằng điểm cuối/kết nối/nội suy của Máy chủ IdentityServer của tôi đôi khi rất chậm (10 giây cho một cuộc gọi). Như bạn có thể thấy dưới đây, hầu hết các cuộc gọi (18k) thực hiện một cách nhanh chóng (< 250ms).Profiler BLOCKED_TIME trong IdentityServer4/Newtonsoft.Json

Overview of request performance

Tôi đã kích hoạt mới Application Insights profiling và hầu hết các dấu vết chậm giống như thế này:

Profiler trace of a slow operation

Như đã nói trên Application Insights profiler page:

BLOCKED_TIME chỉ ra mã đang chờ một tài nguyên khác để khả dụng, s uch đang chờ đối tượng đồng bộ hóa, đợi để có một chuỗi hoặc chờ yêu cầu hoàn tất.

Nhưng tôi không có lý do gì để tin điều này nên chờ đợi điều gì đó. Không có yêu cầu tăng đột biến vì vậy tôi không nghĩ rằng không có đủ chủ đề có sẵn hoặc một cái gì đó. Bộ nhớ dường như không có vấn đề gì với gói dịch vụ ứng dụng của chúng tôi vì nó luôn ở mức khoảng 40%. Tôi cũng đã đào sâu vào nguồn của IdentityServer4 nhưng không thể xác định bất kỳ nguyên nhân nào cho việc này. Vì vậy, bây giờ tôi đang bị mắc kẹt. Bất cứ ai có thể chỉ cho tôi nguyên nhân có thể cho các yêu cầu chậm? Hoặc chỉ cho tôi theo hướng tốt để xác định nguyên nhân? Bất kỳ trợ giúp sẽ được nhiều đánh giá cao!

Chỉnh sửa với một số thông tin bổ sung: Chúng tôi sử dụng IdentityServer4.EntityFramework để lưu trữ mã thông báo tham chiếu trong sql azure sql. Tôi đã xem Thông tin chi tiết về ứng dụng và các truy vấn trong các yêu cầu chậm đó thực hiện sau 50ms. Vì vậy, tôi đoán nó không phải là cơ sở dữ liệu.

+0

Bạn có thể hiển thị số lượng cuộc gọi cũng như thời gian thực hiện trong kết quả tiểu sử đó không? – dbc

+0

Tôi không thấy tùy chọn để hiển thị số lượng cuộc gọi nhưng tôi đoán nó sẽ không nhiều vì nó sẽ chỉ tuần tự hóa mã thông báo một lần. – Zenuka

Trả lời

2

Xem thông tin, Tất cả các yêu cầu của bạn là khoảng 3222 ms, cho đến khi bạn bắt đầu tuần tự hóa JSON của mình. Khi bạn bắt đầu tuần tự hóa dữ liệu của bạn thành JSON JSON, yêu cầu nhảy lên 5589 ms, khi bạn deserialize nó nhảy đến 8811ms.

Vấn đề ở đây không phải là DB, DB có thể nhận dữ liệu đủ nhanh. Không phải là đột biến trong yêu cầu, mà bạn không có, cũng không phải vấn đề bộ nhớ không tồn tại.

Vấn đề là thực tế bạn đang tìm nạp nhiều dữ liệu, có lẽ và trình biên dịch có hình phạt khi tuần tự hóa và deserializing dữ liệu, cả hai hành động này là khá tốn kém.

Bạn phải sắp xếp danh sách dưới dạng JSON, sau đó deserialize nó vào một đối tượng mà bạn có thể truy cập lại.

Nhìn vào những gì xảy ra giữa các cuộc gọi đó, lượng dữ liệu bạn đang sắp xếp và deserializing và những gì xảy ra sau đó.

Đó là chìa khóa của bạn.

+0

Tôi đã tra cứu Mã thông báo lớn nhất trong cơ sở dữ liệu và đăng ký nó 100 lần và mức trung bình (cho tổng số 100 tuần tự) là khoảng 100ms. Vì vậy, tôi không thấy làm thế nào điều này có thể là vấn đề. Mã thông báo lớn nhất là 33581 ký tự. Tôi có thiếu thứ gì đó trong câu trả lời của bạn không? Tuần tự hóa và Deserializing nên được đồng bộ phải không? Điều đó không giải thích được thời gian bị chặn đúng không? – Zenuka