Сбор диагностики в контейнерах
Те же средства диагностика, которые полезны для диагностики проблем .NET в других сценариях, также работают в контейнерах Docker. Но для использования некоторых средств в контейнере нужно выполнить определенные действия. В этой статье объясняется, как использовать средства сбора трассировок производительности и дампов в контейнерах Docker.
Использование средств .NET CLI в контейнере
Эти средства применяются: ✔️ пакет SDK для .NET Core 3.1 и более поздние версии
Средства диагностики .NET global CLI (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor и dotnet-trace) предназначены для работы в различных средах и должны работать непосредственно в контейнерах Docker. Из-за этого эти средства являются предпочтительным способом сбора диагностических сведений для сценариев .NET, предназначенных для .NET Core 3.1 или более поздней версии в контейнерах.
Вы также можете установить эти средства без пакета SDK для .NET, скачав один файл из ссылок в предыдущем абзаце. Для этих установок требуется глобальная установка среды выполнения .NET версии 3.1 или более поздней, которую можно получить после любого из указанных методов в документации по установке .NET или используя любой из официальных контейнеров среды выполнения.
Использование средств глобальной командной строки .NET в контейнере боковинка
Если вы хотите использовать глобальные средства диагностики .NET CLI для диагностики процессов в другом контейнере, учитывайте следующие дополнительные требования:
- Контейнеры должны совместно использовать пространство имен процесса (чтобы средства в контейнере расширения могли обращаться к процессам в целевом контейнере).
- Для средств диагностики .NET global CLI требуется доступ к файлам среды выполнения .NET, записываемых в каталог /tmp, поэтому каталог /tmp должен быть предоставлен общий доступ между целевым и боковиным контейнером через подключение тома. Например, для этого контейнеры должны совместно использовать общий том или том Kubernetes emptyDir. При попытке использовать средства диагностики из контейнера расширения без предоставления общего доступа к каталогу /tmp возникает ошибка, информирующая о том, что совместимая среда выполнения .NET не запущена.
Использование PerfCollect
в контейнере
Область применения: ✔️ .NET Core 2.1 и более поздних версий
Скрипт PerfCollect
используется для сбора трассировок производительности. Это рекомендуемое средство сбора трассировок при использовании версий, предшествующих .NET Core 3.0. При использовании PerfCollect
в контейнере учитывайте следующие требования:
PerfCollect
требует дополнительных возможностейperf
для запуска средства. Минимальный набор необходимых возможностей —PERFMON
иSYS_PTRACE
. Для некоторых сред требуетсяSYS_ADMIN
. Обязательно запустите контейнер с необходимыми возможностями. Если минимальный набор не работает, попробуйте использовать полный набор.PerfCollect
требует, чтобы некоторые переменные среды были заданы до начала профилирования приложения. Их можно задать в Dockerfile или при запуске контейнера. Так как эти переменные не должны задаваться в обычных рабочих средах, как правило, они добавляются при запуске контейнера для профилирования. Две переменные, которые требуются PerfCollect, следующие.DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Примечание.
При выполнении приложения с помощью .NET 7 необходимо также задать DOTNET_EnableWriteXorExecute=0
в дополнение к предыдущим переменным среды.
Примечание.
.NET 6 стандартизует префикс DOTNET_
вместо COMPlus_
для переменных среды, которые настраивают поведение .NET во время выполнения. Но префикс COMPlus_
будет и дальше работать. Если вы используете предыдущую версию среды выполнения .NET, следует и дальше использовать префикс COMPlus_
для переменных среды.
Использование PerfCollect
в контейнере боковинка
Если вы хотите запустить PerfCollect
в одном контейнере для профилирования процесса .NET в другом контейнере, интерфейс почти такой же. Различия описаны ниже.
- Переменные среды, упомянутые ранее (
DOTNET_PerfMapEnabled
иDOTNET_EnableEventLog
), нужно установить для целевого контейнера (а не для того, в котором выполняетсяPerfCollect
). - В контейнере, где выполняется
PerfCollect
, должна быть возможностьSYS_ADMIN
(не в целевом контейнере). - Два контейнера должны совместно использовать пространство имен процесса.