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


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

Те же средства диагностика, которые полезны для диагностики проблем .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 для диагностики процессов в другом контейнере, учитывайте следующие дополнительные требования:

  1. Контейнеры должны совместно использовать пространство имен процесса (чтобы средства в контейнере расширения могли обращаться к процессам в целевом контейнере).
  2. Для средств диагностики .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 (не в целевом контейнере).
  • Два контейнера должны совместно использовать пространство имен процесса.