Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
EventPipe — это компонент среды выполнения, который можно использовать для сбора данных трассировки, аналогичных etW или perf_events. Цель EventPipe заключается в том, чтобы разработчики .NET могли легко отслеживать свои приложения .NET, не опираясь на компоненты высокой привилегии платформы, такие как ETW или perf_events.
EventPipe — это механизм для многих средств диагностики, который можно использовать для потребления событий, генерируемых средой выполнения, а также настраиваемых событий, написанных с помощью EventSource.
Эта статья представляет собой общий обзор EventPipe. Здесь описано, как и когда использовать EventPipe, а также как настроить это средство в соответствии с вашими потребностями.
Основы EventPipe
EventPipe объединяет события, созданные компонентами среды выполнения, например JIT-компилятором или сборщиком мусора, а также события, записанные из экземпляров EventSource в библиотеках и пользовательском коде.
События затем сериализуются в .nettrace формате файла и могут быть записаны непосредственно в файл или передаваться через диагностический порт для внепроцессного использования.
Дополнительные сведения о формате NetTrace см. в документации по формату NetTrace.
EventPipe и ETW/perf_events
EventPipe является частью среды выполнения .NET и предназначен для обеспечения одинаковой работы на всех платформах .NET Core. Это позволяет средствам трассировки, основанным на EventPipe, например dotnet-counters, dotnet-gcdump и dotnet-trace, беспрепятственно работать на разных платформах.
Однако, поскольку EventPipe является встроенным компонентом среды выполнения, его область ограничена управляемым кодом и самой средой выполнения. При отсутствии других средств трассировки события EventPipe включают трассировки стека, содержащие только информацию об управляемых кадрах кода. Чтобы получить события из других неуправляемых библиотек пользовательского режима, выборки ЦП для машинного кода или событий ядра, используйте такие средства трассировки, как ETW или perf_events. В Linux средство perfcollect помогает автоматизировать использование perf_events и LTTng.
Начиная с .NET 10 EventPipe в Linux может выдавать события как user_events, что позволяет собирать управляемые события, события ОС/ядра и собственные вызовы в единой трассировке. В этом режиме требуются права администратора или root и ядро Linux 6.4+. Дополнительные сведения см. в разделе dotnet-trace collect-linux.
Еще одно важное различие между EventPipe и ETW/perf_events заключается в требовании привилегий администратора или root. Для трассировки приложения с помощью ETW или perf_events необходимо иметь права администратора или быть root-пользователем. Используя стандартный EventPipe, можно отслеживать приложения, пока трассировщик (например, dotnet-trace) выполняется как тот же пользователь, что и пользователь, запускающий приложение. В описанном выше режиме EventPipe (user_events) требуются права администратора или суперпользователя, так как он взаимодействует с инфраструктурой трассировки на уровне ОС.
В следующей таблице представлена сводка различий между EventPipe и ETW/perf_events.
| Функция | EventPipe | EventPipe (user_events) | Трассировка событий Windows | perf_события |
|---|---|---|---|---|
| Кросс-платформенность | Да | Нет (только в поддерживаемых дистрибутивах Linux) | Нет (только в Windows) | Нет (только в поддерживаемых дистрибутивах Linux) |
| Требуются права администратора или корневого пользователя | нет | Да | Да | Да |
| Может получать события операционной системы или ядра ОС | нет | Да | Да | Да |
| Может разрешить собственные стеки вызовов | нет | Да | Да | Да |
Использование EventPipe для трассировки приложения .NET
EventPipe можно использовать для трассировки приложения .NET различными способами:
Используйте одно из средств диагностики, созданных на основе EventPipe.
Используйте библиотеку Microsoft.Diagnostics.NETCore.Client, чтобы написать собственное средство для настройки и запуска сеансов EventPipe.
Для запуска EventPipe используйте переменные среды.
После создания файла nettrace, содержащего события EventPipe, можно просмотреть файл в PerfView или Visual Studio. На платформах, отличных от Windows, можно преобразовать файл nettrace в формат трассировки speedscope или Chromium с помощью команды dotnet-trace convert и просмотреть ее с помощью speedscope или Chrome DevTools.
Трассировки EventPipe можно также анализировать программно с помощью TraceEvent.
Средства, использующие EventPipe
Это самый простой способ использовать EventPipe для трассировки приложения. Дополнительные сведения об использовании каждого из этих средств см. в документации к каждому средству.
dotnet-counters позволяет отслеживать и получать различные метрики, созданные средой выполнения .NET и основными библиотеками, а также пользовательские метрики, которые можно писать.
dotnet-gcdump позволяет выполнять сбор дампов кучи сборщика мусора для активных процессов для анализа управляемой кучи приложения.
dotnet-trace позволяет собирать данные анализа производительности приложений.
Трассировка с помощью переменных среды
Предпочтительным механизмом для использования EventPipe является средство dotnet-trace или библиотека Microsoft.Diagnostics.NETCore.Client.
Однако вы можете использовать следующие переменные среды, чтобы настроить сеанс EventPipe в приложении и записать трассировку непосредственно в файл. Чтобы прекратить трассировку, закройте приложение.
DOTNET_EnableEventPipe: задайте для этого значение1, чтобы запустить сеанс EventPipe, который записывает прямо в файл. Значение по умолчанию —0.DOTNET_EventPipeOutputPath: путь к выходному файлу трассировки EventPipe, когда его выполнение настроено черезDOTNET_EnableEventPipe. Значение по умолчанию —trace.nettrace, которое будет создано в том же каталоге, из которого выполняется приложение.Примечание.
Начиная с версии .NET 6, экземпляры строки
{pid}вDOTNET_EventPipeOutputPathзаменяются идентификатором отслеживаемого процесса.DOTNET_EventPipeCircularMB: шестнадцатеричное значение, представляющее размер внутреннего буфера EventPipe в мегабайтах. Это значение конфигурации используется только в том случае, если EventPipe настроен для выполнения черезDOTNET_EnableEventPipe. Размер буфера по умолчанию — 1024 МБ, который для этой переменной среды преобразуется в значение400, поскольку0x400==1024.Примечание.
Если для целевого процесса события записываются слишком часто, это может привести к переполнению буфера и удалению некоторых событий. Если удаляется слишком много событий, увеличьте размер буфера и посмотрите, уменьшается ли число удаленных событий. Если количество пропущенных событий не уменьшается при увеличении размера буфера, это может быть связано с тем, что медленный читатель мешает освобождению буферов целевого процесса.
DOTNET_EventPipeProcNumbers: установите значение1, чтобы включить захват номеров процессоров в заголовках событий EventPipe. Значение по умолчанию —0.DOTNET_EventPipeConfig: конфигурирует настройки сеанса EventPipe при его запуске с помощьюDOTNET_EnableEventPipe. Синтаксис выглядит следующим образом:<provider>:<keyword>:<level>Можно также указать несколько поставщиков, объединив их с помощью запятой:
<provider1>:<keyword1>:<level1>,<provider2>:<keyword2>:<level2>Если эта переменная среды не задана, но EventPipe включен с помощью
DOTNET_EnableEventPipe, компонент начнет трассировку, включив следующие поставщики со следующими ключевыми словами и уровнями:Microsoft-Windows-DotNETRuntime:4c14fccbd:5Microsoft-Windows-DotNETRuntimePrivate:4002000b:5Microsoft-DotNETCore-SampleProfiler:0:5
Дополнительные сведения о некоторых известных поставщиках в .NET см. в статье Стандартные поставщики событий в .NET.