2010-12-15 23 views
9

Antecedentes rápidos: Entiendo que HTTPListener utiliza el controlador http.sys kernel, que supuestamente lo convierte en un gran intérprete. Sin embargo, al hacer algunos benchmarks de rendimiento entre un servidor HTTP administrado y un servidor vC++ nativo, estoy viendo un aumento aproximado de 15 MB/s en el lado nativo. La configuración de prueba es dos máquinas de laboratorio recién formateadas con 1 gb nics. En el lado nativo, estoy viendo alrededor de 110 MB/s, que es cerca del 100% de la sobrecarga nic, cuando uso HTTPListener estoy viendo ~ 94 MB/s (máximo de 100).HTTPListener vs Native HTTP performance

Las pruebas son manzanas con manzanas,

  • tanto enviar la misma carga útil (~ 120 MB)
  • estoy usando la misma aplicación cliente administrado para probar ambos servidores
  • Para Gestionado tengo discapacitados Nagle (Pero probado en ambos sentidos, el resultado es el mismo)
  • Ejecuto un lote de pruebas y calculo el rendimiento, la nota interesante es que la desviación estándar administrada es mayor, es decir, los resultados no son tan consistentes en comparación con los nativos.

En general, espero que pueda acercarme a los 110 MB/s del servidor nativo a través de HTTPListener, 15 MB/s parece bastante costoso.

Preguntas: 1. ¿Hay otras optimizaciones para la gestión que me falta? 2. ¿Cuáles son algunos cuellos de botella potenciales? Miré HTTPResponseStream a través del reflector, parece que hay algunas referencias, pero no hay problemas evidentes. De hecho, al usar fragmentación produce una matriz de fragmentos idéntica a la de mi servidor nativo.

Todas las ideas son apreciados,

+0

¿En qué API compiló su implementación de C++? –

+0

¿La desviación estándar más alta para la aplicación administrada podría deberse a la recolección de basura? ¿Estás creando/abandonando muchos objetos? –

+1

¿Quién dijo que la clase 'HttpListener' usa HTTP.SYS ?? IIS sí pero no 'HttpListener', de hecho hubiera sido interesante si lo hubiera hecho. Por lo tanto, proporcione la referencia si cree que es así. – Aliostad

Respuesta

1

El hecho de que utiliza http.sys no quiere decir que no hay una transición nativo a gestionados. Desde el artículo de MSDN mencionado anteriormente:

HTTP.sys proporciona gestión de conexión, aceleración del ancho de banda y registro del servidor web.

En virtud del hecho de que está ejecutando el código administrado, tiene interoperabilidad (originaria de gestión, que no debe confundirse con la interoperabilidad COM), que tiene la recolección de basura, etc. Nunca va a ser tan rápido como una implementación nativa pura de C++.

EDITAR: Para aclarar esto, todavía está ejecutando un proceso .NET, simplemente está enganchándose a IIS en modo kernel, no en modo de usuario. Un gran artículo sobre esto está aquí: http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp