Tengo una aplicación cliente/servidor. El componente del servidor se ejecuta, utiliza WCF de forma 'remota' (formateador binario, objetos de sesión).Código de C# muy lento con el depurador conectado; ¿Error de MemoryMappedFile?
Si comienzo el componente del servidor y ejecuto el cliente, la primera tarea que completa el servidor es < 0.5sec.
Si comienzo el componente del servidor con el depurador VS adjunto, y luego ejecuto el cliente, la tarea tarda más de 20 segundos en completarse.
No hay cambios en el código, no hay cambios en la compilación condicional. Lo mismo ocurre si tengo el componente del servidor compilado y ejecutándose en 32 bits, 64 bits, con el proceso de alojamiento de VS, sin el proceso de alojamiento VS, o cualquier combinación de esas cosas.
Posiblemente importante: Si utilizo el VS.NET perfilador (modo de muestreo), entonces la aplicación se ejecuta tan rápido como si no hubiera un depurador asociado. Entonces no puedo diagnosticarlo de esa manera. Acabo de comprobar, el modo de instrumentación también se ejecuta rápidamente. Lo mismo para el modo de perfil de concurrencia, funciona rápidamente.
datos clave:
- La aplicación utiliza múltiples hilos bastante pesado (40 hilos en el grupo de subprocesos estándar). La creación de los hilos pasa rápidamente independientemente y no es un punto lento. Hay muchos bloqueos,
WaitHandle
syMonitor
patrones - La aplicación no genera excepciones en absoluto.
- La aplicación no crea salida de consola.
- La aplicación es código completamente administrado.
- La aplicación no mapa algunos archivos en el disco a un archivo proyectado en memoria: 1x750MB y 12x8MB y algunos más pequeños
rendimiento medido:
- uso de la CPU es mínimo en ambos casos; cuando el depurador está conectado, la CPU se encuentra en < 1%
- El uso de memoria es mínimo en ambos casos; tal vez 50 o 60 MB en ambos casos
- hay un montón de fallos de página que suceden (MMF ref), sin embargo de que se produzcan más lentamente cuando el depurador asociado
- Si no se utiliza el proceso de alojamiento VS, o básicamente la 'depuración remota monitor 'entra en juego, entonces que usa una cantidad decente de CPU y crea un buen número de fallas de página. Pero esa no es la única vez que ocurre el problema
- La diferencia en el rendimiento se ve independientemente de cómo se ejecute el cliente. La única variable que se cambia es el componente del servidor que se ejecuta a través de "Iniciar con la depuración" frente a la iniciada desde el Explorador.
Mis ideas:
- WCF lento cuando depurado?
- MemoryMappedFile ¿se ralentiza cuando se depura?
- 40 hilos utilizados: ¿lento para depurar? Tal vez Monitors/locks notifique depurador?La programación de subprocesos se vuelve extraña/los cambios de contexto son muy poco frecuentes?
- radiación de fondo de la concesión de la inteligencia y cruel sentido del humor para VS
Todo parece poco probable estúpidamente.
lo tanto, mi pregunta:
- Por qué sucede esto?
- Si se desconoce el n. ° 1, ¿cómo puedo diagnosticar/averiguar?
¿Has habilitado la captura de excepción de 1ª oportunidad? También puede intentar habilitar .NET Server Source Stepping para capturar un máximo de excepciones subyacentes "ocultas" en el modo de depuración, especialmente las de (de) serlización. Además, ¿qué pasa con los rastros (outputdebugstring u otro)? –
Sí, no se emiten excepciones, todas las categorías de excepción (incluido .NET) habilitadas para la 1ra oportunidad. No hay salida de consola de depuración (eso es lo que quise decir con la salida de la consola, voy a editar para aclarar). Acabo de habilitar .NET Framework Source Stepping (no pude ver Server Source Stepping) ... encontré algunas excepciones. Se actualizará momentáneamente –
Excepción de WCF: "El carácter '', valor hexadecimal 0x20, no se puede incluir en un nombre.".No tenía * idea * de que las excepciones pudieran ocultarse de esta manera: ¿no es una excepción una excepción? Veré qué puedo hacer para resolverlo. ¿Tal vez podría publicar una respuesta para que pueda obtener algunos votos positivos/y aceptar si esto lo soluciona? :) –