Zapisywanie rejestratorów obsługujących wiele procesorów

Możliwość korzystania z wielu procesorów przez program MSBuild może skrócić czas kompilowania projektu, ale także zwiększa złożoność tworzenia rejestrowania zdarzeń. W środowisku jednoprocesorowym zdarzenia, komunikaty, ostrzeżenia i błędy docierają do rejestratora w przewidywalny, sekwencyjny sposób. Jednak w środowisku wieloprocesorowym zdarzenia z różnych źródeł mogą pojawiać się w tym samym czasie lub poza sekwencją.

Generowanie dziennika binarnego (-binlog lub -bl przełącznika) i wyświetlenie go za pomocą przeglądarki dzienników strukturalnych w dużej mierze rozwiązuje ten problem. W programie MSBuild w wersji 17.8 lub nowszej można również wypróbować rejestrator terminalu (-tl przełącznik), aby uzyskać bardziej przyjazne dla użytkownika dane wyjściowe rejestrowania w czasie rzeczywistym w konsoli programu .

W przypadku bardziej ogólnego rozwiązania program MSBuild udostępnia rejestrator obsługujący wiele procesorów i model rejestrowania, którego można użyć do tworzenia niestandardowych "rejestratorów przekazujących".

Wyzwania związane z rejestrowaniem wielu procesorów

Podczas kompilowanie co najmniej jednego projektu w systemie wieloprocesorowym lub wielordzeniowym zdarzenia kompilacji programu MSBuild dla wszystkich projektów są generowane w tym samym czasie. Lawina komunikatów o zdarzeniach może pojawić się w rejestratorze w tym samym czasie lub poza sekwencją. Ponieważ rejestrator MSBuild 2.0 nie jest przeznaczony do obsługi tej sytuacji, może przeciążyć rejestrator i spowodować wydłużenie czasu kompilacji, nieprawidłowe dane wyjściowe rejestratora, a nawet uszkodzoną kompilację. Aby rozwiązać te problemy, rejestrator może przetwarzać zdarzenia poza sekwencją i korelować zdarzenia i ich źródła.

Możesz jeszcze bardziej zwiększyć wydajność rejestrowania, tworząc niestandardowy rejestrator przekazywania dalej. Niestandardowy rejestrator przekazujący działa jako filtr, umożliwiając wybranie, przed utworzeniem tylko zdarzeń, które chcesz monitorować. W przypadku korzystania z niestandardowego rejestratora przesyłania dalej niepożądane zdarzenia nie mogą przeciążyć rejestratora, zaśmiecania dzienników lub powolnych czasów kompilacji.

Modele rejestrowania wieloprocesorowego

Aby zapewnić problemy z kompilacją związane z wieloma procesorami, program MSBuild obsługuje dwa modele rejestrowania, centralne i rozproszone.

Centralny model rejestrowania

W centralnym modelu rejestrowania pojedyncze wystąpienie MSBuild.exe działa jako "węzeł centralny", a wystąpienia podrzędne węzła centralnego ("węzły pomocnicze") są dołączane do węzła centralnego, aby ułatwić wykonywanie zadań kompilacji.

Model rejestratora centralnego

Rejestratory różnych typów dołączonych do węzła centralnego są nazywane "centralnymi rejestratorami". Do węzła centralnego można jednocześnie dołączyć tylko jedno wystąpienie każdego typu rejestratora.

W przypadku kompilacji węzły pomocnicze kierują swoje zdarzenia kompilacji do węzła centralnego. Węzeł centralny kieruje wszystkie swoje zdarzenia, a także węzły pomocnicze do co najmniej jednego dołączonego centralnego rejestratora. Rejestratory tworzą następnie pliki dziennika, które są oparte na danych przychodzących.

Mimo że wymagane jest zaimplementowanie tylko ILogger przez centralny rejestrator, zaleca się również zaimplementowanie INodeLogger , aby centralny rejestrator zainicjował liczbę węzłów uczestniczących w kompilacji. Następujące przeciążenie Initialize metody wywołuje się, gdy aparat inicjuje rejestrator.

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

Wszystkie wstępnie istniejące ILoggerrejestratory oparte na systemie mogą działać jako centralne rejestratory i mogą być dołączane do kompilacji. Jednak centralne rejestratory napisane bez jawnej obsługi scenariuszy rejestrowania wielu procesorów i zdarzeń poza kolejnością mogą spowodować przerwanie kompilacji lub wygenerowanie bezsensownych danych wyjściowych.

Model rejestrowania rozproszonego

W centralnym modelu rejestrowania zbyt duży ruch przychodzący komunikatów może przeciążyć węzeł centralny, na przykład wtedy, gdy wiele projektów jest kompilujących w tym samym czasie. Może to przeciążyć zasoby systemowe i zmniejszyć wydajność kompilacji. Aby rozwiązać ten problem, program MSBuild obsługuje model rejestrowania rozproszonego.

Model rozproszonego rejestrowania

Model rejestrowania rozproszonego rozszerza centralny model rejestrowania, umożliwiając utworzenie rejestratora przekazującego.

Przekazywanie rejestratorów

Rejestrator przekazywania jest pomocniczym, lekkim rejestratorem, który ma filtr zdarzeń dołączany do węzła pomocniczego i odbiera przychodzące zdarzenia kompilacji z tego węzła. Filtruje on zdarzenia przychodzące i przekazuje tylko te, które są określone w węźle centralnym. Zmniejsza to ruch komunikatów wysyłany do węzła centralnego i poprawia ogólną wydajność kompilacji.

Istnieją dwa sposoby korzystania z rejestrowania rozproszonego w następujący sposób:

  • Dostosuj wstępnie skompikowanego rejestratora przekazywania o nazwie ConfigurableForwardingLogger.

  • Napisz własny niestandardowy rejestrator przesyłania dalej.

Możesz zmodyfikować ConfigurableForwardingLogger tak, aby odpowiadały twoim wymaganiom. W tym celu wywołaj rejestrator w wierszu polecenia przy użyciu MSBuild.exe i wyświetl listę zdarzeń kompilacji, które mają być przekazywane do węzła centralnego.

Alternatywnie możesz utworzyć niestandardowy rejestrator przesyłania dalej. Tworząc niestandardowy rejestrator przekazujący, można dostosować zachowanie rejestratora. Jednak tworzenie niestandardowego rejestratora przekazywania jest bardziej złożone niż tylko dostosowywanie configurableForwardingLogger. Rejestrator przekazywania można utworzyć, implementując IForwardingLogger interfejs, który pochodzi z klasy ILogger. Interfejs jest definiowany jako:

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

Aby przekazać zdarzenie, o które dba rejestrator, wywołaj ForwardEvent metodę interfejsu IEventRedirector w rejestratorze przesyłania dalej. Przekaż odpowiedni BuildEventArgsparametr , lub pochodną jako parametr. Następnie zdarzenia będą przekazywane do centralnego rejestratora i mogą być tam działały.

Aby uzyskać więcej informacji, zobacz Creating forwarding loggers (Tworzenie rejestratorów przekazywania).

Używanie narzędzia ConfigurableForwardingLogger do prostego rejestrowania rozproszonego

Aby dołączyć rejestrator przekazywania niestandardowego ConfigurableForwardingLogger lub niestandardowego, użyj przełącznika -distributedlogger (-dl w skrócie) w kompilacji wiersza polecenia MSBuild.exe . Format określania nazw typów i klas rejestratora jest taki sam jak w -logger przypadku przełącznika, z wyjątkiem tego, że rozproszony rejestrator zawsze ma dwie klasy rejestrowania zamiast jednej, rejestrator przekazywania i centralny rejestrator. Poniżej przedstawiono przykład sposobu dołączania niestandardowego rejestratora przekazywania o nazwie XMLForwardingLogger.

msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*XMLForwardingLogger,MyLogger,Version=1.0.2,Culture=neutral

Uwaga

Gwiazdka (*) musi oddzielić dwie nazwy rejestratora w przełączniku -dl .

Użycie elementu ConfigurableForwardingLogger jest podobne do używania dowolnego innego rejestratora (zgodnie z opisem w sekcji Uzyskiwanie dzienników kompilacji), z wyjątkiem dołączania rejestratora ConfigurableForwardingLogger zamiast typowego rejestratora MSBuild i określa się jako parametry zdarzeń, które mają być przekazywane do węzła centralnego.

Jeśli na przykład chcesz otrzymywać powiadomienia tylko po uruchomieniu i zakończeniu kompilacji, a w przypadku wystąpienia błędu przekażesz BUILDSTARTEDEVENTparametry , BUILDFINISHEDEVENTi ERROREVENT jako parametry. Wiele parametrów można przekazać, oddzielając je średnikami. Poniżej przedstawiono przykład użycia programu ConfigurableForwardingLogger do przekazywania tylko zdarzeń BUILDSTARTEDEVENT, BUILDFINISHEDEVENTi ERROREVENT .

msbuild.exe myproj.proj -distributedlogger:XMLCentralLogger,MyLogger,Version=1.0.2,Culture=neutral*ConfigureableForwardingLogger,C:\My.dll;BUILDSTARTEDEVENT; BUILDFINISHEDEVENT;ERROREVENT

Poniżej znajduje się lista dostępnych parametrów ConfigurableForwardingLogger.

ConfigurableForwardingLogger Parameters
BUILDSTARTEDEVENT
BUILDFINISHEDEVENT
PROJECTSTARTEDEVENT
PROJEKTFINISHEDEVENT
TARGETSTARTEDEVENT
TARGETFINISHEDEVENT
ZADANIESTARTEDEVENT
ZAKOŃCZENIE ZADANIA
ERROREVENT
WARNINGEVENT
HIGHMESSAGEEVENT
NORMALMESSAGEEVENT
LOWMESSAGEEVENT
CUSTOMEVENT
COMMANDLINE
PERFORMANCESUMMARY
NOSUMMARY
SHOWCOMMANDLINE