Невозможно запустить do tnet dump в контейнере 3.1 docker - «Процесс 1 работает несовместимо. NET Core runtime» - PullRequest
0 голосов
/ 07 августа 2020

После обновления моего ранее очень стабильного приложения do tnet core с 2.0 до 3.1 оно начало испытывать утечку памяти. Я пытаюсь получить дамп ядра, чтобы проанализировать, что использует всю память, но я столкнулся с несколькими камнями преткновения, пытаясь это сделать.

Мое приложение работает в контейнере docker на основе mcr.microsoft.com/dotnet/core/sdk:3.1 для сборки и mcr.microsoft.com / dotnet / core / as pnet: 3.1-bioni c для времени выполнения.

Для отладки я использую mcr.microsoft.com / dotnet / core / sdk: 3.1-bioni c, а затем устанавливаю необходимые инструменты:

dotnet tool install -g dotnet-dump
dotnet tool install -g dotnet-counters
dotnet tool install -g dotnet-trace

Когда я пытаюсь запустить do tnet -trace, чтобы захватить pid, он каждый раз возвращает другой pid:

root@499333cca890:/app# dotnet trace ps
      1290 dotnet     /usr/share/dotnet/dotnet

root@499333cca890:/app# dotnet trace ps
      1311 dotnet     /usr/share/dotnet/dotnet

root@499333cca890:/app# dotnet trace ps
      1332 dotnet     /usr/share/dotnet/dotnet

Это может быть сама трассировка, а не мое приложение? pid, о котором сообщает ps aux, равен 1 (я предполагаю, что это docker вещь):

root@499333cca890:/app# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.4  7.7 21890008 158932 ?     Ssl  05:52   1:14 dotnet MyApp.dll

Если я попытаюсь сделать дамп ядра через do tnet core dump collect -p 1 Я получаю следующее:

Process 1 not running compatible .NET Core runtime.

Вот результат команды do tnet --info:

.NET Core SDK (reflecting any global.json):
 Version:   3.1.302
 Commit:    41faccf259

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  18.04
 OS Platform: Linux
 RID:         ubuntu.18.04-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.302/

Host (useful for support):
  Version: 3.1.6
  Commit:  3acd9b0cd1

.NET Core SDKs installed:
  3.1.302 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

И вот целевая структура из моего csproj:

<TargetFramework>netcoreapp3.1</TargetFramework>

Локально я запускаю macos в качестве хоста docker и устанавливаю привилегии и включаю SYS_PTRACE:

 docker run -d --privileged --cap-add SYS_PTRACE [...]

Эти параметры были моим последним открытием, и я думал, что они будут решением, но все равно не повезло. Я предполагаю, что это что-то еще в тех строках, которые мне не хватает? В остальном это всего лишь приложение 3.1, работающее с последней версией SDK 3.1, поэтому я не могу понять, почему там возникла проблема.

1 Ответ

0 голосов
/ 12 августа 2020

Построчно сравнивая мое приложение с новым проектом веб-приложения do tnet, который не показал такого же поведения, я обнаружил, что причиной является эта строка в моем методе Program.cs Main ():

CreateHostBuilder(args).Start()

Изменение этого значения на следующее решает проблему доступа к диагностике, а также проблему с памятью, с которой я столкнулся:

CreateHostBuilder(args).Build().Run()

Это значение по умолчанию в новом веб-приложении do tnet. проект, поэтому не уверен, где я взял использование .Start (). Разница заключается в том, что Run асинхронный, Start в конечном итоге вызывает те же методы, но ожидает асинхронной задачи, поэтому я предполагаю, что он может блокировать другие задачи.

...