Tengo una aplicación de servidor ASP.NET 3.5 escrita en C#. Realiza solicitudes de salida a una API REST utilizando HttpWebRequest y HttpWebResponse.HttpWebResponse no escalará solicitudes de salida simultáneas
He configurado una aplicación de prueba para enviar estas solicitudes en hilos separados (para simular de manera imprecisa la concurrencia con el servidor).
Tenga en cuenta que esto es más una pregunta de Mono/Medio ambiente que una pregunta de código; así que tenga en cuenta que el siguiente código no es literal; solo un corte/pegado de los bits funcionales.
Aquí hay algunos pseudo-código:
// 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();
}
}
Si funciono con la aplicación en mi máquina de desarrollo local (Windows 7) en el servidor de Estudio Web visual, que puede hasta los numThreads y recibir la misma respuesta promedio tiempo con variación mínima ya sea 1 "usuario" o 100.
Publicar y desplegar la aplicación en Apache2 en un entorno Mono 2.10.2, la escala de tiempos de respuesta es casi lineal. (es decir, 1 subproceso = 300 ms, 5 subprocesos = 1500 ms, 10 subprocesos = 3000 ms). Esto sucede independientemente del punto final del servidor (nombre de host diferente, red diferente, etc.).
Usando IPTRAF (y otras herramientas de red), parece como si la aplicación solo abre 1 o 2 puertos para enrutar todas las conexiones y las respuestas restantes tienen que esperar.
Hemos creado una aplicación PHP similar e implementada en Mono con las mismas solicitudes y las respuestas se escalan de forma adecuada.
He revisado cada configuración de configuración que se me ocurre para Mono y Apache y la ÚNICA configuración que es diferente entre los dos entornos (al menos en código) es que a veces el ServicePoint admitePipelining = falso en Mono, mientras es cierto desde mi máquina.
Parece que ConnectionLimit (valor predeterminado de 2) no cambia en Mono por alguna razón, pero estoy estableciendo un valor más alto tanto en el código como en el archivo web.config para el host especificado.
O mi equipo y yo estamos pasando por alto algo importante o esto es algún tipo de error en Mono.
¿Has encontrado una solución? – Kugel