Tôi có ứng dụng máy chủ ASP.NET 3.5 được viết bằng C#. Nó làm cho các yêu cầu gửi đến một API REST bằng cách sử dụng HttpWebRequest và HttpWebResponse.HttpWebResponse sẽ không mở rộng cho các yêu cầu gửi đi đồng thời
Tôi đã thiết lập một ứng dụng thử nghiệm để gửi các yêu cầu này trên các chuỗi riêng biệt (để mơ hồ bắt chước đồng thời với máy chủ).
Xin lưu ý đây là câu hỏi về Mono/Environment nhiều hơn câu hỏi về mã; vì vậy hãy nhớ rằng mã bên dưới không đúng nguyên văn; chỉ cần cắt/dán các bit chức năng.
Dưới đây là một số mã giả:
// threaded client piece
int numThreads = 1;
ManualResetEvent doneEvent;
using (doneEvent = new ManualResetEvent(false))
{
for (int i = 0; i < numThreads; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Test), random_url_to_same_host);
}
doneEvent.WaitOne();
}
void Test(object some_url)
{
// setup service point here just to show what config settings Im using
ServicePoint lgsp = ServicePointManager.FindServicePoint(new Uri(some_url.ToString()));
// set these to optimal for MONO and .NET
lgsp.Expect100Continue = false;
lgsp.ConnectionLimit = 100;
lgsp.UseNagleAlgorithm = true;
lgsp.MaxIdleTime = 100000;
_request = (HttpWebRequest)WebRequest.Create(some_url);
using (HttpWebResponse _response = (HttpWebResponse)_request.GetResponse())
{
// do stuff
} // releases the response object
// close out threading stuff
if (Interlocked.Decrement(ref numThreads) == 0)
{
doneEvent.Set();
}
}
Nếu tôi chạy các ứng dụng trên máy tính phát triển địa phương của tôi (Windows 7) trong máy chủ Studio web Visual, tôi có thể lên numThreads và nhận được phản hồi trung bình cùng thời gian có biến thể tối thiểu cho dù đó là 1 "người dùng" hoặc 100.
Xuất bản và triển khai ứng dụng lên Apache2 trên môi trường Mono 2.10.2, thời gian phản hồi quy mô gần như tuyến tính. (ví dụ: 1 sợi = 300ms, 5 chủ đề = 1500 mili giây, 10 luồng = 3000 mili giây). Điều này xảy ra bất kể điểm cuối máy chủ (tên máy chủ khác nhau, mạng khác nhau, v.v.).
Sử dụng IPTRAF (và các công cụ mạng khác), có vẻ như ứng dụng chỉ mở 1 hoặc 2 cổng để định tuyến tất cả các kết nối và các phản hồi còn lại phải đợi.
Chúng tôi đã xây dựng một ứng dụng PHP tương tự và được triển khai trong Mono với cùng yêu cầu và tỷ lệ phản hồi một cách thích hợp.
Tôi đã chạy qua mọi cài đặt cấu hình đơn lẻ mà tôi có thể nghĩ đến cho Mono và Apache và cài đặt CHỈ khác nhau giữa hai môi trường (ít nhất là trong mã) là đôi khi ServicePoint SupportsPipelining = false in Mono, trong khi đó là đúng từ máy của tôi.
Dường như mặc dù ConnectionLimit (mặc định là 2) không bị thay đổi trong Mono vì lý do nào đó nhưng tôi đặt giá trị cao hơn cả mã và web.config cho (các) máy chủ được chỉ định.
Hoặc tôi và nhóm của tôi đang xem cái gì đó quan trọng hoặc đây là một số loại lỗi trong Mono.
Bạn đã tìm thấy giải pháp chưa? – Kugel