Ведение журнала в многопроцессорной среде
Обновлен: Ноябрь 2007
Предоставленная в MSBuild 3.5 возможность использования нескольких процессоров позволяет значительно сократить время построения проекта, но усложняет ведение журнала. В среде с одним процессором средство ведения журнала может обрабатывать входящие события, сообщения, предупреждения и ошибки последовательно и вполне предсказуемо. Но в многопроцессорной среде события из разных источников могут поступать одновременно или не по порядку. В MSBuild 3.5 предлагается новое средство ведения журнала, которое поддерживает режим нескольких процессоров и позволяет создавать пользовательские "средства ведения журнала переадресации".
Ведение журнала при многопроцессорных построениях
Если выполняется построение одного или нескольких проектов в многопроцессорной или многоядерной системе, в MSBuild создаются события для всех проектов, которые формируются одновременно. Множество данных о событиях может поступать в средство ведения журнала одновременно или не по порядку. Это может привести к переполнению средства ведения журнала, а также повлечь за собой увеличение времени построения, неверные выходные данные в средстве ведения журнала или даже повреждение построения. Для решения этих проблем средство ведения журнала MSBuild 3.5 может обрабатывать события не по порядку и соотносить события с их источниками.
Чтобы повысить эффективность функции ведения журнала, создайте пользовательское средство ведения журнала переадресации. Созданное пользователем средство ведения журнала переадресации действует как фильтр, позволяя перед построением выбрать события, за которыми нужно вести наблюдение. Благодаря пользовательскому средству ведения журнала переадресации можно предотвратить переполнение средства ведения журнала ненужными событиями, загромождение журналов или замедление построения.
Централизованная модель ведения журнала
Для многопроцессорных построений в MSBuild используется "централизованная модель ведения журнала". В этой централизованной модели один экземпляр MSBuild.exe действует в качестве основного процесса построения, или "центрального узла". К центральному узлу подключены дополнительные экземпляры MSBuild.exe, или "дополнительные узлы". Все средства ведения журнала, поддерживающие ILogger и подключенные к центральному узлу, называются "центральными средствами ведения журнала", а средства ведения журнала, подключенные к дополнительным узлам, называются "дополнительными средствами ведения журнала".
При построении дополнительные средства ведения журнала осуществляют переадресацию своего трафика событий в центральные средства ведения журнала. Поскольку события исходят из нескольких дополнительных узлов, данные поступают в центральный узел одновременно, но при этом чередуются. Для разрешения ссылок типа "событие-проект" и "событие-целевой объект" в аргументы события включается добавочная контекстная информация о событии построения.
Несмотря на то, что центральным средством ведения журнала должна быть реализована только задача ILogger, рекомендуется также реализовать задачу INodeLogger для инициализации центрального средства ведения журнала с учетом числа узлов, участвующих в построении. При инициализации средства ведения журнала в системе вызывается следующая перегрузка метода Initialize:
public interface INodeLogger: ILogger
{
public void Initialize(IEventSource eventSource, int nodeCount);
}
Распределенная модель ведения журнала
В централизованной модели ведения журнала такой большой трафик входящих сообщений, что при одновременном построении множества проектов может произойти переполнение центрального узла, в результате чего увеличивается нагрузка на систему и снижается производительность построения.
Чтобы снизить вероятность появления этой проблемы в MSBuild поддерживается также "распределенная модель ведения журналов", которая расширяет централизованную модель за счет создания средств ведения журналов переадресации. Средство ведения журнала переадресации подключается к дополнительному узлу и принимает входящие события построения от этого узла. Средство ведения журнала переадресации похоже на обычное средство ведения журнала, но, в отличие от обычного средства, может фильтровать события и переадресовывать только нужные в центральный узел. В результате уменьшается трафик сообщений в центральном узле и, соответственно, повышается производительность.
Чтобы создать средство ведения журнала переадресации, выполните реализацию интерфейса IForwardingLogger, получаемого из ILogger. Интерфейс определяется следующим образом:
public interface IForwardingLogger: INodeLogger
{
public IEventRedirector EventRedirector { get; set; }
public int NodeId { get; set; }
}
Для переадресации событий в средстве ведения журнала переадресации вызовите метод ForwardEvent интерфейса IEventRedirector. В качестве параметра передайте BuildEventArgs или производную.
Дополнительные сведения см. в разделе Создание средства ведения журнала переадресации.
Подключение распределенного средства ведения журнала
Чтобы подключить распределенное средство ведения журнала в построении с использованием командной строки, используйте ключ /distributedlogger (сокращенно /dl). Для указания имен типов и классов средства ведения журнала используется тот же формат, что и для ключа /logger, с той лишь разницей, что распределенное средство ведения журнала включает два класса: средство ведения журнала переадресации и центральное средство ведения журнала. Пример подключения распределенного средства ведения журнала:
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
В ключе /dl имена двух средств ведения журнала отделяются звездочкой (*).
См. также
Задачи
Практическое руководство. Написание средства ведения журнала