Tôi có đoạn code sau đây mà tôi benchmark với JMeter và nhận được khoảng 3000 yêu cầu mỗi giây trên máy localhost của tôi (các await
thiếu cố ý để chạy đồng bộ):Điểm chuẩn ASP.NET yêu cầu đồng thời kết quả nghèo
public async Task<HttpResponseMessage> Get()
{
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
Vấn đề là khi tôi tạm dừng yêu cầu trong một giây như dưới đây, vì lý do nào đó thông lượng giảm xuống 10 yêu cầu mỗi giây cho mỗi quá trình w3wp.exe (một lần nữa, await
bị thiếu cố tình chạy đồng bộ):
public async Task<HttpResponseMessage> Get()
{
Task.Delay(1000).Wait();
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
Ngay cả khi tôi sử dụng await
không có sự khác biệt và 10 yêu cầu mỗi giây không được cải thiện ở tất cả:
public async Task<HttpResponseMessage> Get()
{
await Task.Delay(1000);
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
Tôi đã thử tất cả các thiết lập cấu hình và không có gì làm cho bất kỳ sự thay đổi nào cả: '
web.config
<system.net>
<connectionManagement>
<add address="*" maxconnection="65400" />
</connectionManagement>
</system.net>
aspnet.co nfig
<system.web>
<applicationPool
maxConcurrentThreadsPerCPU="100" />
</system.web>
Machine.config
<processModel
autoConfig="false"
memoryLimit="70"
maxWorkerThreads="100"
maxIoThreads="100" />
Các configs được thiết lập cho cả x86 và x64
tôi có 32 đồng biểu diễn của mem và 4 lõi vật lý, Windows 10 .
CPU không tải quá 10% khi đặt 10 yêu cầu mỗi giây.
Mã trên sử dụng API WEB, nhưng tất nhiên tôi tạo lại kết quả tương tự bằng Trình xử lý HTTP.
Sử dụng một máy chủ web mục đích chung một ứng dụng ASP.NET được thiết kế tốt sẽ xử lý khoảng 300 lần tương tác người dùng thực. Hệ thống kiến trúc kém bắt đầu thấy những con số không biến mất. Để tăng thông lượng trên một máy chủ cửa sổ duy nhất bạn muốn xem bằng cách sử dụng "vườn web". Nói chung, nút cổ chai của bạn không phải là máy chủ web mà là trạng thái được chia sẻ của bạn (ví dụ: cơ sở dữ liệu của bạn). –
@ChrisMarisic Tôi sử dụng một khu vườn web – realPro
10 req/s cho một yêu cầu thời gian thực hiện 1 giây có vẻ khá bình thường với bất kỳ công nghệ nào. Và nó cũng bình thường mà CPU không được sử dụng (yêu cầu chỉ cần chờ đợi mà không tốn bất kỳ xử lý). Bạn mong chờ điều gì? –