2012-04-24 32 views
14

Mi programa utiliza un número predeterminado de subprocesos que cada uno hace un trabajo independiente. Utilizo la CPU i7-2600 pero apago el módulo de hiper-hilo para que ejecute 4 hilos en 4 núcleos. Cuando ejecuto el programa con 1 subproceso, el uso de la CPU es del 25%, lo que es perfecto ya que 1 subproceso se usa por completo, pero cuando ejecuto 4 o 3 subprocesos solo obtengo un 60% de CPU, ¿por qué?uso de CPU de subproceso múltiple en C#

Como mencioné antes, los hilos son totalmente independientes (no hay bloqueos ni contiendas) también cuando ejecuto el programa 4 veces con 1 hilo obtengo 100% de uso de CPU (es decir, cuando sus 4 procesos de 1 hilo por cada proceso obtengo el uso adecuado de la CPU)

¿Alguna idea?

algo de información más:

  1. no estoy usando E/S durante el procesamiento de todos los datos necesarios se carga en la memoria, cada hilo carga sus propios datos antes del procesamiento.
  2. Cargué los datos de una base de datos (utilizando oleDb) pero el problema que estoy describiendo sucede después de la carga mientras se procesan todos los hilos (no se realiza la carga).
  3. Los números son:
    • 2 hilos alrededor del 40% en lugar de 50 (85% para cada hilo).
    • 3 hilos alrededor del 50% en lugar de 75 (65% para cada hilo).
    • 4 hilos alrededor del 60% en lugar de 100 (60% para cada hilo).
  4. Uso i7 2600 con memoria de 16GB pero el uso de la memoria en ese proceso no se acerca a eso.
  5. Ejecuto el monitor de rendimiento de Windows para buscar las diferencias.
+1

¿Estás haciendo el bloqueo de las llamadas de E/S? – ChaosPandion

+0

depende de qué está haciendo cada subproceso y cómo se sincroniza entre ellos y la cantidad de E/S que realiza. Además, en .Net no siempre se obtiene cada subproceso en una nueva CPU – IanNorton

+2

Si son totalmente independientes, probablemente compitan por el ancho de banda de la memoria en bruto. Eso, o espacio en caché. –

Respuesta

3

Puede intentar cambiar su programa de la estación de trabajo al modo de recolección de basura del servidor. Actualmente puede usar solo un hilo de recolección de basura.
La configuración se explica here.
Consulte este thread para obtener una explicación/más detalles.
No espere 100% de carga de la CPU después del cambio, pero se acercará al 100% y aumentará la velocidad de la misma.

+0

El OP pregunta por qué están viendo el comportamiento que están viendo. Esto no responde esa pregunta. –

+0

No está diciendo qué GC está usando, pero la configuración del recolector de basura tal vez por qué no está viendo su comportamiento esperado. – weismat

+0

Cambié a serverGC y parece ser el truco, supongo que el GC tomó algo de energía mientras funcionó en el fondo –

1

El concurrency visualizer le ayudará aquí. Verá cuándo se está ejecutando cada subproceso y si no se están ejecutando todos los subprocesos, puede ver exactamente por qué está esperando un subproceso específico. Si genera una gran cantidad de basura, el GC puede mantener los hilos bloqueados lo que lleva a una escala inferior a la lineal. Pero solo lo descubrirás haciendo una investigación real.

+0

Creo que no tengo visualizador de simultaneidad ya que uso VS2010 pro, ¿alguna otra herramienta que pueda recomendar? –

+0

Puede probar la vista previa de desarrollo 2011, creo que le permite usar todas las funciones http://channel9.msdn.com/posts/Visual-Studio-vNext-Concurrency-Visualizer –

1

que tenían el mismo problema al trabajar con .NET Framework v2.0 entonces he cambiado el marco de destino para proyectos v4.0 comenzó con carga de la CPU 100%

Editar: Usted puede ver el uso de CPU por hilos , simplemente con

Sysinternals Process Explorer

o

Process Hacker

+0

Gracias por la sugerencia sobre "Sysinternals Process Explorer" I echará un vistazo –