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:
- 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).
- 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 herramientaperf
. El conjunto mínimo de funcionalidades necesarias esPERFMON
ySYS_PTRACE
. Algunos entornos requierenSYS_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
yDOTNET_EnableEventLog
) se deben establecer para el contenedor de destino (no el que ejecutaPerfCollect
). - El contenedor que ejecuta
PerfCollect
debe tener la funcionalidadSYS_ADMIN
(no el contenedor de destino). - Los dos contenedores deben compartir un espacio de nombres de proceso.