Ich habe eine ASP.NET 3.5-Server-Anwendung in C# geschrieben. Ausgehende Anforderungen an eine REST-API werden mit HttpWebRequest und HttpWebResponse erstellt.HttpWebResponse wird nicht für gleichzeitige ausgehende Anfragen skalieren
Ich habe eine Testanwendung eingerichtet, um diese Anforderungen an separate Threads zu senden (um die Parallelität des Servers vage nachzuahmen).
Bitte beachten Sie, dass dies eher eine Mono/Environment Frage als eine Code Frage ist; Bitte beachten Sie, dass der folgende Code nicht wortgetreu ist; nur ein Ausschneiden/Einfügen der Funktionsbits. Hier
ist einige Pseudo-Code:
// 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();
}
}
Wenn ich die Anwendung auf meinem lokalen Entwicklungsmaschine (Windows 7) in der Visual Studio-Web-Server laufen, kann ich die numThreads und erhalten die gleiche avg Antwort Zeit mit minimaler Variation ob es 1 "Benutzer" oder 100 ist.
Veröffentlichen und Bereitstellen der Anwendung auf Apache2 in einer Mono 2.10.2-Umgebung skalieren die Antwortzeiten fast linear. (1 Thread = 300 ms, 5 Thread = 1500 ms, 10 Threads = 3000 ms). Dies geschieht unabhängig vom Serverendpunkt (unterschiedlicher Hostname, anderes Netzwerk usw.).
Mit IPTRAF (und anderen Netzwerk-Tools) scheint es, als ob die Anwendung nur 1 oder 2 Ports öffnet, um alle Verbindungen zu routen und die verbleibenden Antworten müssen warten.
Wir haben eine ähnliche PHP-Anwendung erstellt und in Mono mit den gleichen Anforderungen und den entsprechenden Antworten implementiert.
Ich habe jede einzelne Konfigurationseinstellung durchlaufen, die ich für Mono und Apache kennengelernt habe und die EINZIGE Einstellung, die zwischen den beiden Umgebungen (zumindest im Code) unterschiedlich ist, ist manchmal, dass der ServicePoint SupportsPipelining = false in Mono ist ist wahr von meiner Maschine.
Es scheint, als ob die ConnectionLimit (Standard 2) in Mono aus irgendeinem Grund nicht geändert wird, aber ich setze es auf einen höheren Wert in Code und der web.config für den/die angegebenen Host (s).
Entweder ich und mein Team übersehen etwas Bedeutendes oder dies ist eine Art Bug in Mono.
Haben Sie eine Lösung gefunden? – Kugel