Comparteix a través de


Recopilación de diagnósticos en contenedores

Las mismas herramientas de diagnóstico que son útiles para diagnosticar problemas de .NET en otros escenarios también funcionan en contenedores de Docker. Sin embargo, algunas de las herramientas requieren pasos especiales para funcionar en un contenedor. En este artículo se explica cómo se pueden usar herramientas para reunir seguimientos del rendimiento y recopilar volcados en contenedores de Docker.

Uso de herramientas de la CLI de .NET en un contenedor

Estas herramientas se aplican a: ✔️ SDK de .NET Core 3.1 y versiones posteriores

Las herramientas de diagnóstico de la CLI global de .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor y dotnet-trace) están diseñadas para funcionar en una amplia variedad de entornos y deben funcionar directamente en contenedores de Docker. Por este motivo, estas herramientas son el método preferido para recopilar información de diagnóstico para escenarios de .NET que tienen como destino .NET Core 3.1 o superior en contenedores.

También puede instalar estas herramientas sin el SDK de .NET descargando las variantes de archivo único de los vínculos del párrafo anterior. Estas instalaciones requieren una instalación global de la versión 3.1 o posterior del entorno de ejecución de .NET, que puede adquirir siguiendo cualquiera de los métodos prescritos en la documentación de instalación de .NET o usando cualquiera de los contenedores oficiales en tiempo de ejecución.

Uso de las herramientas de la CLI global de .NET en un contenedor sidecar

Si desea usar las herramientas de diagnóstico de la CLI global de .NET para diagnosticar los procesos en otro contenedor, tenga en cuenta los siguientes requisitos adicionales:

  1. Los contenedores deben compartir un espacio de nombres de proceso (de modo que las herramientas del contenedor sidecar puedan acceder a los procesos del contenedor de destino).
  2. Las herramientas de diagnóstico de la CLI global de .NET necesitan acceso a los archivos que el entorno de ejecución de .NET escribe en el directorio /tmp, por lo que el directorio /tmp debe compartirse entre el contenedor de destino y sidecar a través de un montaje de volumen. Esto puede hacerse, por ejemplo, haciendo que los contenedores compartan un volumen común o un volumen emptyDir de Kubernetes. Si intenta usar las herramientas de diagnóstico desde un contenedor sidecar sin compartir el directorio /tmp, obtendrá un error que indica que el proceso "no está ejecutando un entorno de ejecución de .NET compatible".

Uso de PerfCollect en un contenedor

Esta herramienta se aplica a: ✔️ .NET Core 2.1 y versiones posteriores

El script PerfCollect resulta útil para recopilar seguimientos del rendimiento y es la herramienta recomendada para recopilar seguimientos anteriores a .NET Core 3.0. Si utiliza PerfCollect en un contenedor, tenga en cuenta los siguientes requisitos:

  • PerfCollect requiere funcionalidades adicionales para ejecutar la herramienta perf. El conjunto mínimo de funcionalidades necesarias es PERFMON y SYS_PTRACE. Algunos entornos requieren SYS_ADMIN. Asegúrese de iniciar el contenedor con las funcionalidades necesarias. Si el conjunto mínimo no funciona, pruebe con el conjunto completo.

  • PerfCollect requiere que se establezcan algunas variables de entorno antes de que se inicie la generación de perfiles de la aplicación. Se pueden establecer en un Dockerfile o cuando se inicia el contenedor. Dado que estas variables no deben establecerse en entornos de producción normales, es habitual simplemente agregarlas al iniciar un contenedor del que se va a crear un perfil. Las dos variables que requiere PerfCollect son:

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

Nota:

Al ejecutar la aplicación con .NET 7, también debe establecer DOTNET_EnableWriteXorExecute=0, además de las variables de entorno anteriores.

Nota:

.NET 6 estandariza en el prefijo DOTNET_ en lugar de en COMPlus_ para las variables de entorno que configuran el comportamiento en tiempo de ejecución de .NET. Sin embargo, el prefijo COMPlus_ seguirá funcionando. Si usa una versión anterior del runtime de .NET, debe seguir usando el prefijo COMPlus_ para las variables de entorno.

Uso de PerfCollect en un contenedor sidecar

Si desea ejecutar PerfCollect en un contenedor para generar un perfil de un proceso de .NET en un contenedor diferente, la experiencia es casi la misma. Las diferencias son:

  • Las variables de entorno mencionadas anteriormente (DOTNET_PerfMapEnabled y DOTNET_EnableEventLog) se deben establecer para el contenedor de destino (no el que ejecuta PerfCollect).
  • El contenedor que ejecuta PerfCollect debe tener la funcionalidad SYS_ADMIN (no el contenedor de destino).
  • Los dos contenedores deben compartir un espacio de nombres de proceso.