2015-12-10 32 views
11

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.

+3

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). –

+0

@ChrisMarisic Tôi sử dụng một khu vườn web – realPro

+1

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ì? –

Trả lời

2

Dưới đây là một sự hiểu biết có thể. Một để điều tra, anyway.

Task.Delay() tạo một tác vụ mới, công việc của bạn là tạm dừng. Nếu tôi hiểu đúng, nhiệm vụ thường được gửi đến hồ bơi công nhân .Net, có kích thước giới hạn. (Bạn có thể kiểm tra với ThreadPool.GetMaxThreads) Khi bạn cố gắng đặt quá nhiều vào, mã sẽ 'sao lưu' vì nó chờ hồ bơi thread có không gian.

Vì vậy, giả sử bạn có một nhóm chủ đề có kích thước 40. Sau khi bạn đã gửi 40 tác vụ, tất cả chờ một giây, bạn sẽ tối đa nhóm chủ đề. Nút cổ chai của bạn sẽ là các nhiệm vụ, làm săn chắc hồ bơi chủ đề, không tạo ra không gian.

Thông thường, các tác vụ làm IO đắt tiền như truy vấn cơ sở dữ liệu hoặc kiểm soát hiệu suất của tệp IO trong khi chờ công việc được thực hiện. Tôi tự hỏi nếu Task.Delay là nhiều hơn 'clingy'.

Thử đổi Task.Delay() cho System.Threading.Thread.Sleep() và xem có thay đổi gì không.

+0

Sử dụng System.Threading.Thread.Sleep() đã giảm yêu cầu mỗi giây xuống còn 8 yêu cầu mỗi giây. – realPro

1

Tôi biết cho Windows 8 có giới hạn kết nối đồng thời tối đa là 10 để ngăn người dùng cố gắng sử dụng hệ điều hành của người tiêu dùng để chạy tải công việc của máy chủ. Tôi không thấy lý do tại sao Windows 10 sẽ khác biệt.

http://blogs.iis.net/owscott/windows-8-iis-8-concurrent-requests-limit

+0

Vâng, tôi thấy bài đăng này quá và do đó, được cài đặt máy chủ 2016 để chạy thử nghiệm, nhưng hành vi không thay đổi theo bất kỳ cách nào. – realPro

Các vấn đề liên quan