Estoy trabajando en un nuevo servicio para ejecutar QA para las propiedades web múltiples de nuestras empresas, y me he encontrado con un problema de concurrencia de red interesante. Para aumentar el rendimiento, estoy usando el TPL para crear HttpWebRequests a partir de una gran colección de urls para que puedan ejecutarse en paralelo; sin embargo, parece que no puedo encontrar dónde está el cuello de botella en el proceso.Problemas concurrentes de rendimiento de solicitud web
Mis observaciones hasta el momento:
- yo puede conseguir a un máximo de alrededor de 25-30 hilos paralelos a través de la TPL
- La CPU nunca se rompe 5-6% para el servicio (que se ejecuta en de 1 - 4 núcleos, con y sin H/T)
- El uso de NIC nunca se rompe 2-3%
- El tráfico de red global no parece verse afectado (otros usuarios no se quejan, las pruebas de velocidad se ejecutan al mismo tiempo don ' t muestra mucho de un efecto)
- Velocidad no no cambia mucho entre ejecutarse en nuestra red de oficina (15Mbps) o en nuestro centro de datos (100 + Mbps)
- Obtengo un poco de rendimiento al descargar de varios hosts a la vez en lugar de muchas páginas de un host.
posibles puntos de dolor:
- CPU (número de núcleos o hilos de hardware)
- NIC
- Max permitió número de HttpWebRequests concurrentes
- LAN
- WAN
- Router/Switch/Load balancer
Entonces la pregunta es:
Obviamente ahora hay manera de descargar la totalidad de Internet en cuestión de minutos, pero estoy interesado en saber dónde está el cuello de botella está en un escenario como este y lo que, si cualquier cosa, se puede hacer para superarlo.
Como nota al margen, actualmente estamos utilizando un servicio de terceros para rastrear, pero estamos limitados por ellos de alguna manera y desearíamos más flexibilidad. Algo sobre salsa secreta corporativa o poison on the tip of the arrow ... :)
¿Puedes publicar algunos detalles sobre tu código? Estoy ejecutando un rastreador con 100 subprocesos paralelos sin problemas. Estoy en .NET 4 y el servidor no es mucho. Estoy usando NCrawler en el back-end. –
El código es realmente muy simple. Uso Parallel.ForEach para recorrer un conjunto de URL (cadenas). La acción crea una HttpWebRequest y luego vuelca los resultados en un ConcurrentBag. Por cierto, NCrawler parece interesante; Lo comprobaré. Gracias por el consejo. –
Hay un límite en el número de HttpWebRequest simultáneas para el mismo host IIRC –