Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта статья относится к: ✔️ пакету SDK для .NET Core 2.1 и более поздним версиям
При возникновении проблем с производительностью в Linux сбор трассировки perfcollect может быть использован для сбора подробной информации о том, что происходило на компьютере во время проблемы с производительностью.
perfcollect — это bash-скрипт, который использует Linux Trace Toolkit: next generation (LTTng) для сбора событий, записанных из среды выполнения или любого EventSource, а также perf для сбора образцов процессора целевого процесса.
Подготовка компьютера
Выполните следующие действия, чтобы подготовить компьютер к сбору трассировки производительности с помощью perfcollect.
Примечание.
Если вы выполняете захват из контейнера, он должен обладать соответствующими возможностями. Минимальными требуемыми возможностями являются PERFMON и SYS_PTRACE. Если захват не удается выполнить с минимальным набором, добавьте SYS_ADMIN эту возможность в контейнер. Дополнительные сведения о трассировке приложений внутри контейнеров с помощью PerfCollect см. в статье Сбор диагностических данных в контейнерах.
Скачайте
perfcollect.curl -OL https://aka.ms/perfcollectСделайте скрипт исполняемым.
chmod +x perfcollectУстановите предварительные требования трассировки - это и есть фактические библиотеки трассировки.
sudo ./perfcollect installПри этом на вашем компьютере будут установлены следующие предварительные требования:
-
perf: подсистема Linux Performance Events и сопутствующее приложение для сбора/просмотра в пользовательском режиме.perfявляется частью исходного кода ядра Linux, но обычно не устанавливается по умолчанию. -
LTTng: используется для сбора данных событий, генерируемых во время выполнения CoreCLR. Затем эти данные используются для анализа поведения различных компонентов среды выполнения, таких как сборщик мусора, JIT и пул потоков.
-
Последние версии .NET Core и средство Linux perf поддерживают автоматическое разрешение имен методов для кода платформы.
Для разрешения имен методов нативных библиотек DLL времени выполнения (например, libcoreclr.so) perfcollect будет разрешать символы для них при преобразовании данных, но только при наличии символов для этих двоичных файлов. Подробнее см. в разделе Получение символов для нативной среды выполнения .
Сбор трассировки
Имейте две доступные оболочки - одну для управления трассировкой, называемую [Trace], и одну для запуска приложения, называемую [App].
[След] Начать сбор.
sudo ./perfcollect collect sampleTraceОжидаемые выходные данные:
Collection started. Press CTRL+C to stop.Примечание.
LTTng имел критические изменения между версиями 2.12 и 2.13. Среда выполнения .NET в настоящее время поддерживает версию 2.12. Если в вашем дистрибутиве Linux используется версия 2.13 или более поздняя, рекомендуется отключить часть LTTng функции perfcollect. Для этого добавьте опцию '-nolttng' в командную строку perfcollect и на шаге 3 не устанавливайте переменную окружения DOTNET_EnableEventLog.
[Приложение] Настройте оболочку приложения со следующими переменными окружения - это позволит отслеживать конфигурацию CoreCLR.
[Приложение] Настройте оболочку приложения со следующими переменными окружения - это позволит отслеживать конфигурацию CoreCLR.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1Примечание.
При выполнении приложения с помощью .NET 7 необходимо также задать
DOTNET_EnableWriteXorExecute=0в дополнение к предыдущим переменным среды. Рассмотрим пример.export DOTNET_EnableWriteXorExecute=0[Приложение] Запустите приложение - дайте ему работать столько, сколько вам нужно, чтобы зафиксировать проблему с производительностью. Точная длина может быть настолько короткой, насколько это необходимо, при условии, что она в достаточной степени охватывает период времени, в течение которого возникает проблема производительности, которую вы хотите исследовать.
dotnet run[След] Остановите сбор - нажмите Ctrl+C.
^C ...STOPPED. Starting post-processing. This may take some time. Generating native image symbol files ...SKIPPED Saving native symbols ...FINISHED Exporting perf.data file ...FINISHED Compressing trace files ...FINISHED Cleaning up artifacts ...FINISHED Trace saved to sampleTrace.trace.zipТеперь сжатый файл трассировки хранится в текущем рабочем каталоге.
Просмотр трассировки
Существует несколько вариантов просмотра трассировки, которая была собрана. Трассировки лучше всего просматривать с помощью PerfView в Windows, но их можно просмотреть непосредственно в Linux с помощью PerfCollect самого себя или TraceCompass.
Использование PerfCollect для просмотра файла трассировки
Вы можете использовать сам perfcollect для просмотра собранной трассировки. Для этого используйте следующую команду:
./perfcollect view sampleTrace.trace.zip
По умолчанию при этом будет отображаться трассировка ЦП приложения с использованием perf.
Чтобы посмотреть события, которые были собраны с помощью LTTng, вы можете передать флаг -viewer lttng , чтобы увидеть отдельные события:
./perfcollect view sampleTrace.trace.zip -viewer lttng
При этом просмотрщик будет использовать babeltrace просмотрщик для вывода полезной нагрузки событий:
# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }
Использование PerfView для открытия файла трассировки
Чтобы просмотреть агрегированное представление как образца ЦП, так и событий, можно использовать PerfView его на компьютере с Windows.
Скопируйте файл trace.zip с Linux на компьютер с Windows.
Загрузите PerfView из https://aka.ms/perfview.
Запустить PerfView.exe
PerfView.exe <path to trace.zip file>
PerfView отобразит список поддерживаемых представлений на основе данных, содержащихся в файле трассировки.
- Для исследования ЦП выберите стеки ЦП.
- Для получения подробной информации о GCStats выберите GCStats.
- Для получения информации о JIT-компиляции для каждого процесса/модуля/метода выберите JITStats.
- Если представление для нужной информации отсутствует, можно попробовать найти события в представлении необработанных событий. Выберите «События».
Для получения дополнительной информации о том, как интерпретировать представления в PerfView, см. ссылки на справку в самом виде или в главном окне PerfView выберите Справка-Руководство> пользователя.
Примечание.
События, записанные через System.Diagnostics.Tracing.EventSource API (в том числе события из Framework), не будут отображаться под именем провайдера. Вместо этого они записываются как EventSourceEvent события в Microsoft-Windows-DotNETRuntime provider, а их полезные данные сериализуются в формате JSON.
Примечание.
Если вы наблюдаете [unknown] /memfd:doublemapper кадры в именах методов и стеках вызовов, задайте их DOTNET_EnableWriteXorExecute=0 перед запуском приложения, которое вы отслеживаете, с помощью perfcollect.
Использование TraceCompass для открытия файла трассировки
Eclipse TraceCompass - это еще одна опция, которую вы можете использовать для просмотра трасс.
TraceCompass работает и на машинах Linux, поэтому вам не нужно перемещать трассировку на машину с Windows. Чтобы открыть TraceCompass файл трассировки, вам потребуется распаковать файл.
unzip myTrace.trace.zip
perfcollectсохранит собранную трассировку LTTng в формате файла CTF в подкаталоге в .lttngTrace В частности, файл CTF будет расположен в каталоге, который выглядит как lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.
Вы можете открыть файл TraceCompass трассировки CTF, выбрав File -> Open Trace и выбрав metadata файл.
Для получения более подробной информации, пожалуйста, обратитесь к TraceCompass документации.
Получение символов для нативной среды выполнения
Большую часть времени вас интересует собственный код, который perfcollect разрешается по умолчанию. Иногда полезно посмотреть, что происходит внутри библиотек DLL .NET (о чем был последний раздел), но иногда интересно то, что происходит в нативных библиотеках DLL времени выполнения (обычно libcoreclr.so).
perfcollect разрешает символы для них при преобразовании своих данных, но только в том случае, если символы для этих родных библиотек DLL присутствуют (и находятся рядом с библиотекой, для которой они предназначены).
Существует глобальная команда dotnet-symbol , которая делает это. Чтобы использовать dotnet-symbol для получения собственных символов времени выполнения, выполните следующие действия:
Установите
dotnet-symbol:dotnet tool install -g dotnet-symbolСкачайте символы. Если установлена версия среды выполнения .NET Core 2.1.0, для этого необходимо выполнить следующую команду:
mkdir mySymbols dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.soСкопируйте символы в нужное место.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0Если это невозможно сделать из-за того, что у вас нет прав на запись в соответствующий каталог, вы можете использовать его для
perf buildid-cacheдобавления символов.
После этого вы должны получить символьные имена для нативных dll при запуске perfcollect.
Сбор данных в контейнере Docker
Дополнительные сведения об использовании perfcollect в контейнерных средах см. в статье Сбор диагностических данных в контейнерах.
Подробнее о вариантах сбора данных
Вы можете указать следующие необязательные флаги с помощью в perfcollect соответствии с вашими диагностическими потребностями.
Сбор в течение определенного времени
Если вы хотите собрать трассировку за определенный период времени, вы можете использовать -collectsec опцию, за которую следует число, указывающее общее количество секунд для сбора трассировки.
Сбор кривых времени потока
Указание -threadtime with perfcollect позволяет собирать данные об использовании ЦП для каждого потока. Это позволяет анализировать, на что каждый поток тратил свое процессорное время.
Сбор трассировок для управляемой памяти и производительности сборщика мусора
Следующие параметры позволяют собирать события сборщика мусора из среды выполнения.
perfcollect collect -gccollectonly
Собирайте только минимальный набор событий GC Collection. Это наименее подробный профиль коллекции событий GC с наименьшим влиянием на производительность целевого приложения. Эта команда аналогична PerfView.exe /GCCollectOnly collect команде в PerfView.
perfcollect collect -gconly
Собирайте больше подробных событий коллекции GC с помощью событий JIT, Loader и Exception. При этом запрашивается больше подробных событий (таких как сведения о выделении и сведения о присоединении к сборщику мусора) и окажет большее влияние на производительность целевого приложения, чем -gccollectonly вариант. Эта команда аналогична PerfView.exe /GCOnly collect команде в PerfView.
perfcollect collect -gcwithheap
Собирайте самые подробные события сбора GC, которые отслеживают выживание и перемещения кучи. Это позволяет провести глубокий анализ поведения сборщика мусора, но повлечет за собой высокие затраты на производительность, так как каждый сборщик мусора может занять более чем в два раза больше времени. Рекомендуется понимать, как использование этого параметра трассировки влияет на производительность при трассировке в производственных средах.