Compartir a través de


Registrar en un entorno de varios procesadores

Actualización: noviembre 2007

La capacidad de MSBuild 3.5 para utilizar varios procesadores puede reducir significativamente el tiempo de compilación de los proyectos, pero también agrega complejidad al proceso de registro. En un entorno de un solo procesador, el registrador puede administrar eventos de entrada, mensajes, advertencias y errores de una manera predecible y secuencial. Sin embargo, en un entorno de varios procesadores, los eventos de varios orígenes pueden llegar simultáneamente o desordenados. MSBuild 3.5 dispone de un nuevo registrador para varios procesadores y habilita la creación de "registradores de reenvío" personalizados.

Registrar compilaciones de varios procesadores

Cuando se generan uno o varios proyectos en un sistema de varios procesadores o varios núcleos, los eventos de compilación de MSBuild de todos los proyectos se generan simultáneamente. Es posible que llegue una avalancha de datos de eventos al registrador al mismo tiempo o desordenados. Esto podría sobrecargar el registrador y provocar un aumento del tiempo de compilación, resultados incorrectos del registrador o incluso la interrupción de una compilación. Para resolver estos problemas, el registrador de MSBuild 3.5 puede procesar eventos desordenados y asociar los eventos y sus orígenes.

Puede mejorar más la eficacia del registro creando un registrador de reenvío personalizado. Un registrador de reenvío personalizado actúa como filtro que le permite elegir, antes de generar, los eventos que desea supervisar. Cuando se utiliza un registrador de reenvío personalizado, los eventos no deseados no sobrecargan el registrador, desordenan los registros ni ralentizan el tiempo de compilación.

Modelo de registro central

Para compilaciones de varios procesadores, MSBuild utiliza un "modelo de registro central". En el modelo de registro central, una instancia de MSBuild.exe actúa como proceso de compilación principal o "nodo central". Las instancias secundarias de MSBuild.exe, o "nodos secundarios" se asocian al nodo central. Los registradores basados en ILogger asociados al nodo central se conocen como "registradores centrales" y los registradores asociados a los nodos secundarios se conocen como "registradores secundarios".

Cuando se realiza una compilación, los registradores secundarios enrutan su tráfico de eventos a los registradores centrales. Debido a que los eventos se originan en varios nodos secundarios, los datos llegan al nodo central simultáneamente pero intercalados. Para resolver las referencias entre eventos y proyectos y entre eventos y destinos, los argumentos de evento incluyen la información contextual adicional acerca del evento de compilación.

Aunque sólo es necesario que el registrador central implemente ILogger, es recomendable que también implemente INodeLogger si desea que el registrador central se inicialice con el número de nodos que están participando en la compilación. Se invoca la siguiente sobrecarga del método Initialize cuando el motor inicializa el registrador:

public interface INodeLogger: ILogger
{
    public void Initialize(IEventSource eventSource, int nodeCount);
}

Modelo de registro distribuido

En el modelo de registro central, un tráfico excesivo de mensajes entrantes, como cuando se generan muchos proyectos al mismo tiempo, puede sobrecargar el nodo central, saturando el sistema y disminuyendo el rendimiento de la compilación.

Para reducir este problema, MSBuild habilita también un "modelo de registro distribuido" que amplía el modelo de registro central permitiendo crear registradores de reenvío. Un registrador de reenvío se asocia a un nodo secundario y recibe los eventos de compilación entrantes de ese nodo. El registrador de reenvío es como un registrador normal sólo que puede filtrar los eventos y, a continuación, reenviar sólo los deseados al nodo central. De esta manera se reduce el tráfico de mensajes en el nodo central y, por consiguiente, habilita la mejora del rendimiento.

Para crear un registrador de reenvío, puede implementar la interfaz IForwardingLogger, derivada de ILogger. La interfaz se define como:

public interface IForwardingLogger: INodeLogger
{
    public IEventRedirector EventRedirector { get; set; }
    public int NodeId { get; set; }
}

Para reenviar los eventos de un registrador de reenvío, llame al método ForwardEvent de la interfaz IEventRedirector. Pase el BuildEventArgs adecuado, o un derivado, como parámetro.

Para obtener más información, vea Crear registradores de reenvío.

Asociar un registrador distribuido

Para asociar un registrador distribuido en una compilación de la línea de comandos, utilice el modificador /distributedlogger (o, /dl abreviado). El formato para especificar los nombres de los tipos y clases del registrador es igual que el del modificador /logger, sólo que un registrador distribuido consta de dos clases de registro: un registrador de reenvío y un registrador central. A continuación, se muestra un ejemplo de cómo asociar un registrador distribuido:

C:\ WINDOWS\Microsoft.NET\Framework\v3.5.20301>msbuild.exe *.proj 
/distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,
Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,
Culture=neutral

Un asterisco (*) separa los dos nombres de registrador en el modificador /dl.

Vea también

Tareas

Cómo: Escribir un registrador

Conceptos

Crear registradores de reenvío