2011-03-07 10 views
10

Tengo una biblioteca C# que procesa algunos archivos. Creé una consola y una aplicación de escritorio que usa la biblioteca y procesa un archivo de 256 mb en aproximadamente 1 minuto. Luego creé un servicio WCF alojado en un servicio de Windows que usa la misma biblioteca de procesamiento de archivos pero que toma 10 veces más tiempo procesar el mismo archivo de 256mb cuando se lo llama desde un sitio web. El servicio de Windows se ejecuta bajo una cuenta de dominio con privilegios de administrador.WCF Service alojado en el servicio de Windows ejecutando 10 veces más lento que la aplicación de la consola

La sobrecarga de llamar al servicio de WCF es muy rápido sin embargo, el método de LoadFile toma mucho más tiempo. He intentado aumentar la prioridad del proceso durante el arranque a través de

Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; 

en vano. He ejecutado este servicio en un sistema de escritorio Win7 de 64 bits (6 GB), 2003 XP de 32 bits (4 GB) y 2008 R2 de 32 bits (4 GB), todos con resultados similares. Las aplicaciones de consola y escritorio procesan el archivo en aproximadamente 1 minuto en el sistema anterior. El proceso no parece estar limitado por la memoria e ingresa swapville.

Están servicios de las ventanas de alguna manera limitados proceso? ¿Obtendría mejores resultados ejecutando el servicio WCF bajo IIS?

EDIT: Intenté llamar al directorio de la biblioteca desde el sitio web y eso también lleva 10 veces más tiempo que la consola o la aplicación de escritorio.

ACTUALIZACIÓN: Resulta que era Log4PostSharp. Las aplicaciones de consola y escritorio no tenían ningún rastro de log4net en los archivos de configuración, pero el sitio web y el servicio de Windows sí. Había un log4net TraceAppender consumiendo silenciosamente preciosos ciclos de CPU.

+2

¿Cómo estás cargando el archivo exactamente? ¿Probaste con un generador de perfiles para ver dónde está exactamente el cuello de botella? (VS 2010 Ultimate contiene un generador de perfiles) –

+6

Recomendaría restaurar la clase de prioridad del proceso a la normalidad si aún no lo has hecho. La modificación de la prioridad del proceso generalmente no acelerará un programa y podría crear otros problemas. –

+0

@Davide: el generador de perfiles también está en Premium. +1; Este es el camino a seguir. –

Respuesta

4

no se me ocurre por qué el comportamiento que describes está sucediendo - que parece muy extraño. Sin embargo, dado que está procesando un archivo relativamente grande en memoria, es posible que el recolector de basura lo esté afectando. Podría intentar cambiar el modo en que se ejecuta el recolector de elementos no utilizados para ver si tiene algún efecto.

El recolector de basura tiene tres modos - estación de trabajo, servidor y concurrente. Cada uno se comporta de una manera diferente y está optimizado para diferentes tipos de aplicaciones. El modo de estación de trabajo es el modo predeterminado, y es con lo que todos los procesos se ejecutan a menos que esté configurado para usar otra cosa. Se puede encontrar más información sobre los modos en here.

intente configurar explícitamente el recolector de basura para utilizar el modo de servidor (sólo tendrá un efecto sobre una máquina multiprocesador sin embargo). Para ello, ponga lo siguiente en su archivo app.config:

<configuration> 
    <runtime> 
     <gcServer enabled="true" /> 
    </runtime> 
</configuration> 
+0

hasta ahora no hubo suerte con este cambio –

+2

No te rechazaré, pero una ralentización de 10X debido al GC parece exagerada. Hay otras áreas para investigar primero, especialmente dada la muy pequeña cantidad de información que tenemos del PO. –

+0

@Johann: He experimentado ralentizaciones lentas antes debido al recolector de basura mientras se recolecta basura: eche un vistazo al contador de rendimiento '% de tiempo en GC' en una aplicación en ejecución que está haciendo un trabajo arduo. – adrianbanks

Cuestiones relacionadas