Tengo una aplicación que consume mucha CPU. Cuando los datos se procesan en un solo subproceso, el uso de la CPU va al 100% durante muchos minutos. De modo que el rendimiento de la aplicación parece estar limitado por la CPU. He multipli- cado la lógica de la aplicación, lo que resulta en un aumento del rendimiento general. Sin embargo, el uso de CPU apenas supera el 30% -50%. Esperaría que la CPU (y los muchos núcleos) llegaran al 100% ya que procesé muchos datos al mismo tiempo.¿Cuáles son las razones por las cuales el uso de la CPU no llega al 100% con C# y APM?
A continuación se muestra un ejemplo simplificado de la lógica que uso para iniciar los hilos. Cuando ejecuto este ejemplo, la CPU pasa al 100% (en una máquina de 8/16 núcleos). Sin embargo, mi aplicación que usa el mismo patrón no.
public class DataExecutionContext
{
public int Counter { get; set; }
// Arrays of data
}
static void Main(string[] args)
{
// Load data from the database into the context
var contexts = new List<DataExecutionContext>(100);
for (int i = 0; i < 100; i++)
{
contexts.Add(new DataExecutionContext());
}
// Data loaded. Start to process.
var latch = new CountdownEvent(contexts.Count);
var processData = new Action<DataExecutionContext>(c =>
{
// The thread doesn't access data from a DB, file,
// network, etc. It reads and write data in RAM only
// (in its context).
for (int i = 0; i < 100000000; i++)
c.Counter++;
});
foreach (var context in contexts)
{
processData.BeginInvoke(context, new AsyncCallback(ar =>
{
latch.Signal();
}), null);
}
latch.Wait();
}
He reducido el número de bloqueos al mínimo estricto (solo el seguro está bloqueado). La mejor manera que encontré fue crear un contexto en el cual un hilo puede leer/escribir en la memoria. Los contextos no se comparten entre otros hilos. Los hilos no pueden acceder a la base de datos, archivos o red. En otras palabras, hice un perfil de mi aplicación y no encontré ningún cuello de botella.
¿Por qué el uso de la CPU de mi aplicación no es del 50%? ¿Es el patrón que uso? ¿Debo crear mi propio hilo en lugar de usar el grupo de hilos de .Net? ¿Hay algún problema? ¿Hay alguna herramienta que me puedas recomendar para encontrar mi problema?
Gracias!
posible, aunque poco probable sería que el código está provocando una gran cantidad de recolección de basura, que requiere cierta cantidad de sincronización. –