Поделиться через


Сбор диагностики в контейнерах

Средства диагностики, которые используются для диагностики проблем с .NET Core в других сценариях, работают и в контейнерах Docker. Но для использования некоторых средств в контейнере нужно выполнить определенные действия. В этой статье объясняется, как использовать средства сбора трассировок производительности и дампов в контейнерах Docker.

Использование средств .NET CLI в контейнере

Эти средства применяются: ✔️ пакет SDK для .NET Core 3.1 и более поздние версии

Глобальные средства диагностики .NET Core (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor и dotnet-trace) предназначены для работы в различных средах и должны работать непосредственно в контейнерах Docker. Из-за этого эти средства являются предпочтительным способом сбора диагностических сведений для сценариев .NET Core, предназначенных для .NET Core 3.1 или более поздней версии в контейнерах.

Вы также можете установить эти средства без пакета SDK для .NET, скачав один файл из ссылок в предыдущем абзаце. Для этих установок требуется глобальная установка среды выполнения .NET версии 3.1 или более поздней, которую можно получить после любого из указанных методов в документации по установке .NET или используя любой из официальных контейнеров среды выполнения.

Использование глобальных средств .NET Core CLI в контейнере расширения

Если вы хотите использовать глобальные средства диагностики .NET Core CLI для диагностики процессов в другом контейнере, учитывайте следующие дополнительные требования:

  1. Контейнеры должны совместно использовать пространство имен процесса (чтобы средства в контейнере расширения могли обращаться к процессам в целевом контейнере).
  2. Глобальным средствам диагностики .NET Core CLI требуется доступ к файлам, которые среда выполнения .NET Core записывает в каталог /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 Core в другом контейнере, процедура будет практически аналогичной, за исключением следующего:

  • Переменные среды, упомянутые ранее (DOTNET_PerfMapEnabled и DOTNET_EnableEventLog), нужно установить для целевого контейнера (а не для того, в котором выполняется PerfCollect).
  • В контейнере, где выполняется PerfCollect, должна быть возможность SYS_ADMIN (не в целевом контейнере).
  • Два контейнера должны совместно использовать пространство имен процесса.