2012-03-20 14 views
15

Estoy escribiendo una API JSON ASP.NET de alto rendimiento con pronto> 1000 solicitud/segundo. Toda mi lógica y procesamiento se realiza en un IHttpHandler. Medí a través de la clase Cronómetro y el controlador termina una solicitud en alrededor de 0,1 - 0,5 milisegundos.Sitio ASP.NET de alto rendimiento (> 1000 solicitud/segundo)

Pero parece que IIS y/u otros HTTPHandlers (¿Módulos?) Están quitando mucho rendimiento. ¿Puedo medir eso de alguna manera? ¿Cuánta sobrecarga generará una solicitud en IIS cuando se configura para obtener el mejor rendimiento?

¿Ayudará la eliminación de todos los HTTPHandlers, o hay otros trucos para acelerarlo? No necesito mucho del conjunto de características de ASP.NET además de la sesión (incluso podría dar una solución alternativa si proporciona un impulso significativo en el rendimiento).

+1

dado que es 'nativamente' asíncrono y puede ser alojado por sí mismo (por lo que puede evitar ejecutarse en IIS), parece que valdría la pena mirar la ASP.NET Web API (incorporada a MVC4, pero también disponible independiente). Aprendí mucho sobre esto del blog de Henrik @ http://blogs.msdn.com/b/henrikn/ –

+2

FWIW, el fraseo de la pregunta es un poco extraño para mí ya que parece mezclar latencia/ancho de banda (para usar los términos de la red).La latencia para atender una solicitud en particular no parece ser tan importante (fuera de la experiencia del usuario final, sino ortogonal a la escalabilidad) en relación con la capacidad de atenderlos de manera eficiente y concurrente. IOW, si cada solicitud requiriera 1000 ms para el servicio, pero podrías atender 2000 a la vez, igual estarías bien con eso, ¿no? –

+0

No estoy seguro de cuánto se aplicará a la API que está creando, pero si hay algo almacenable en caché, asegúrese de hacerlo. Y si puede permanecer sin estado, probablemente pueda usar ARR y escalar si es necesario. –

Respuesta

9

Medir el rendimiento de un servidor web no es una tarea trivial. Algunas cosas a considerar:

  • Encuentra el cuello de botella real. Esto puede ser memoria, acceso a disco, almacenamiento en caché, acceso a la base de datos, latencia de red, etc. Utilice un generador de perfiles de memoria u otro performance profiler para averiguarlo.
  • Utilice WireShark para encontrar la diferencia entre la duración de la solicitud en su máquina y el tiempo de ejecución de su código.
  • Pruebe otras configuraciones. Dale a ASP.NET más memoria. Actualiza el sistema de prueba. Es decir, pasar de 8GB/2.5GHz con 600 solicitudes/seg a 16GB/3.0GHz puede generar 6500 solicitudes/seg. El crecimiento del rendimiento a menudo no es lineal. Ver this document from Microsoft.
  • Considera añadir una máquina extra. Esto puede producir hasta 50 o incluso una mejora de rendimiento más alta según cómo lo configure. Ver nuevamente ese documento de MS.
  • Verificar these hints by Jon Skeet. El hilo de comentarios también revela algunos cuellos de botella potenciales no obvios.

NOTA 1: conozca sus herramientas. ASP.NET ejecuta cada solicitud en su propio hilo. El intercambio de subprocesos es más rápido que el intercambio de procesos, pero aún requiere tiempo. Si otros manejadores toman tiempo porque están en la cadena de solicitud, es beneficioso desactivarlos.

NOTA 2: uno de los objetivos secundarios originales de stackoverflow era crear un sitio en ASP.NET que tuviera un gran rendimiento en un máximo de 2 servidores y podría manejar> 1 millón de visitantes por hora. Ellos lograron hacer eso. Creo que escribieron algunos blogs, pero no recuerdo dónde están.

5

Esta es una muy buena pregunta. Me di cuenta de lo mismo una vez que ingresas al rango de tiempos de respuesta de un milisegundo, la sobrecarga de ASP.NET comienza a notarse. Puedo confirmar tu observación.

Lo que he hecho con éxito es averiguar qué HttpModules están registrados (usando el Administrador de IIS) y deshabilitar todos los que posiblemente podría deshacerse de ellos. La tubería ASP.NET estándar tiene una gran cantidad de módulos y funcionalidades configuradas.

Si necesita el máximo rendimiento, puede usar una pequeña biblioteca de servidor HTTP y deshacerse de casi todos los gastos generales de esa manera. Esto sería tan increíblemente rápido.

+0

En realidad, no es una regla de oro que un _tiny_ servidor pueda atender más solicitudes que un servidor HTTP grande. Lo opuesto es más común. – Abel

+1

Esto no es pequeño ni grande. Se trata de la cantidad de código que se ejecuta por solicitud. Podemos ver a partir de la latencia que OP mencionó que hay una gran cantidad de código en ejecución. Mucho más que analizar los encabezados HTTP y usar un socket. – usr

+1

de acuerdo con la eliminación de módulos habilitados. Habilite el seguimiento de eventos fallidos (para 100-999 respuestas) y observe todos los módulos llamados. A continuación, elimine todos los módulos que no necesita. - No estoy de acuerdo con la idea del pequeño servidor (pero yo te subvité de todos modos :)) – RickAndMSFT

Cuestiones relacionadas