Generación de perfiles de aplicaciones de producción en Azure con Application InsightsProfile production applications in Azure with Application Insights

Habilitación de Application Insights Profiler para la aplicaciónEnable Application Insights Profiler for your application

Azure Application Insights Profiler proporciona un seguimiento del rendimiento de las aplicaciones que se ejecutan en producción en Azure.Azure Application Insights Profiler provides performance traces for applications that are running in production in Azure. Profiler captura los datos automáticamente a escala sin que afecte de forma negativa a los usuarios.Profiler captures the data automatically at scale without negatively affecting your users. Profiler le ayuda a identificar la ruta de acceso "activa" al código que tarda más tiempo cuando se atiende una solicitud web determinada.Profiler helps you identify the “hot” code path that takes the longest time when it's handling a particular web request.

Profiler funciona con aplicaciones .NET implementadas en los siguientes servicios de Azure.Profiler works with .NET applications that are deployed on the following Azure services. En los vínculos siguientes se pueden encontrar instrucciones específicas para habilitar Profiler para cada tipo de servicio.Specific instructions for enabling Profiler for each service type are in the links below.

Si ha habilitado Profiler, pero no ve los seguimientos, consulte nuestra Guía de solución de problemas.If you've enabled Profiler but aren't seeing traces, check our Troubleshooting guide.

Visualización de datos de ProfilerView Profiler data

Para que Profiler cargue los seguimientos, la aplicación debe administrar las solicitudes de forma activa.For Profiler to upload traces, your application must be actively handling requests. Si está realizando un experimento, puede generar solicitudes dirigidas a la aplicación web mediante Pruebas de rendimiento de Application Insights.If you're doing an experiment, you can generate requests to your web app by using Application Insights performance testing. Si acaba de habilitar Profiler, puede ejecutar una breve prueba de carga.If you've newly enabled Profiler, you can run a short load test. Mientras se ejecuta la prueba de carga, presione el botón Generar perfiles ahora en el panel Profiler Settings (Configuración de Profiler).While the load test is running, select the Profile Now button on the Profiler Settings pane. Una vez que Profiler está en ejecución, genera perfiles aleatoriamente una vez cada hora aproximadamente y durante dos minutos.When Profiler is running, it profiles randomly about once per hour and for a duration of two minutes. Si la aplicación está controlando un flujo constante de solicitudes, Profiler carga los seguimientos cada hora.If your application is handling a steady stream of requests, Profiler uploads traces every hour.

Después de que la aplicación reciba tráfico y Profiler haya tenido tiempo de cargar los seguimientos, podrá verlos.After your application receives some traffic and Profiler has had time to upload the traces, you should have traces to view. Este proceso puede tardar entre 5 y 10 minutos.This process can take 5 to 10 minutes. Para ver los seguimientos, vaya al panel Performance (Rendimiento), seleccione Take Actions (Realizar acciones) y, luego, seleccione el botón Seguimientos de Profiler.To view traces, in the Performance pane, select Take Actions, and then select the Profiler Traces button.

Seguimientos de Profiler de vista previa del panel Rendimiento de Application Insights

Seleccione una muestra para mostrar un desglose de nivel de código del tiempo dedicado a ejecutar la solicitud.Select a sample to display a code-level breakdown of time spent executing the request.

Explorador de seguimiento de Application Insights

El explorador de seguimiento muestra la siguiente información:The trace explorer displays the following information:

  • Mostrar ruta de acceso activa: abre el nodo hoja más grande o al menos algo que se aproxime.Show Hot Path: Opens the biggest leaf node, or at least something close. En la mayoría de los casos, este nodo está cerca de un cuello de botella de rendimiento.In most cases, this node is near a performance bottleneck.
  • Etiqueta: nombre de la función o el evento.Label: The name of the function or event. El árbol muestra una combinación de código y eventos que se han producido (como, por ejemplo eventos HTTP y SQL).The tree displays a mix of code and events that occurred, such as SQL and HTTP events. El evento superior representa la duración total de la solicitud.The top event represents the overall request duration.
  • Transcurrido: el intervalo de tiempo entre el inicio y el final de la operación.Elapsed: The time interval between the start of the operation and the end of the operation.
  • Cuándo: el momento en que se ejecutó la función o el evento con relación a otras funciones.When: The time when the function or event was running in relation to other functions.

Cómo leer datos de rendimientoHow to read performance data

Profiler de servicio de Microsoft usa una combinación de método de muestreo e instrumentación para analizar el rendimiento de la aplicación.The Microsoft service profiler uses a combination of sampling methods and instrumentation to analyze the performance of your application. Cuando la colección detallada está en curso, el generador de perfiles del servicio muestrea cada milisegundo el puntero de instrucción de las CPU de todas las máquinas.When detailed collection is in progress, the service profiler samples the instruction pointer of each machine CPU every millisecond. Cada una de las muestras captura toda la pila de llamadas del subproceso que se está ejecutando actualmente.Each sample captures the complete call stack of the thread that's currently executing. Esto proporciona información detallada sobre lo que dicho subproceso estaba haciendo, con un grado de abstracción tanto de nivel alto como bajo.It gives detailed information about what that thread was doing, at both a high level and a low level of abstraction. Profiler de servicio también recopila otros eventos para realizar el seguimiento de la causalidad y la correlación de actividades, como eventos de cambio de contexto, eventos de biblioteca TPL y eventos de grupo de subprocesos.The service profiler also collects other events to track activity correlation and causality, including context switching events, Task Parallel Library (TPL) events, and thread pool events.

La pila de llamadas que se muestra en la vista de escala de tiempo es el resultado del muestreo y la instrumentación.The call stack that's displayed in the timeline view is the result of the sampling and instrumentation. Como cada muestra captura la pila de llamadas completa del subproceso, incluye código de Microsoft .NET Framework y de otros marcos a los que se haga referencia.Because each sample captures the complete call stack of the thread, it includes code from Microsoft .NET Framework and from other frameworks that you reference.

Asignación de objetos (clr!JIT_New o clr!JIT_Newarr1)Object allocation (clr!JIT_New or clr!JIT_Newarr1)

clr!JIT_New y clr!JIT_Newarr1 son funciones auxiliares de .NET Framework que asignan memoria desde un montón administrado.clr!JIT_New and clr!JIT_Newarr1 are helper functions in .NET Framework that allocate memory from a managed heap. clr!JIT_New se invoca cuando se asigna un objeto.clr!JIT_New is invoked when an object is allocated. clr!JIT_Newarr1 se invoca cuando se asigna una matriz de objetos.clr!JIT_Newarr1 is invoked when an object array is allocated. Estas dos funciones suelen ser rápidas y tardan relativamente poco tiempo.These two functions are usually fast and take relatively small amounts of time. Si clr!JIT_New o clr!JIT_Newarr1 tardan mucho tiempo en la escala de tiempo, significa que el código podría estar asignando muchos objetos y consumiendo una importante cantidad de memoria.If clr!JIT_New or clr!JIT_Newarr1 takes a lot of time in your timeline, the code might be allocating many objects and consuming significant amounts of memory.

Código de carga (clr!ThePreStub)Loading code (clr!ThePreStub)

clr!ThePreStub es una función auxiliar de .NET Framework que prepara el código para ejecutarse por primera vez.clr!ThePreStub is a helper function in .NET Framework that prepares the code to execute for the first time. Esta ejecución suele incluir, pero sin limitarse a ello, la compilación JIT (Just-In-Time).This execution usually includes, but isn't limited to, just-in-time (JIT) compilation. Para cada método de C#, se debe invocar clr!ThePreStub una vez como máximo durante un proceso.For each C# method, clr!ThePreStub should be invoked at most once during a process.

Si clr!ThePreStub tarda mucho tiempo con una solicitud, significa que la solicitud es la primera que ejecuta ese método.If clr!ThePreStub takes a long time for a request, the request is the first one to execute that method. El entorno en tiempo de ejecución de .NET Framework tarda un tiempo considerable en cargar el primer método.The time for .NET Framework runtime to load the first method is significant. Podría plantearse la posibilidad de usar un proceso de preparación que ejecute esa parte del código antes de que los usuarios accedan a él, o bien ejecutar el Generador de imágenes nativo (ngen.exe) en sus ensamblados.You might consider using a warmup process that executes that portion of the code before your users access it, or consider running Native Image Generator (ngen.exe) on your assemblies.

Contención de bloqueo (clr!JITutil_MonContention o clr!JITutil_MonEnterWorker)Lock contention (clr!JITutil_MonContention or clr!JITutil_MonEnterWorker)

clr!JITutil_MonContention o clr!JITutil_MonEnterWorker indican que el subproceso actual está a la espera de que se libere un bloqueo.clr!JITutil_MonContention or clr!JITutil_MonEnterWorker indicates that the current thread is waiting for a lock to be released. Este texto se muestra normalmente al ejecutar una instrucción LOCK de C#, al invocar el método Monitor.Enter o al invocar un método con el atributo MethodImplOptions.Synchronized.This text is often displayed when you execute a C# LOCK statement, invoke the Monitor.Enter method, or invoke a method with the MethodImplOptions.Synchronized attribute. La contención de bloqueo se produce normalmente cuando un subproceso A adquiere un bloqueo y un subproceso B intenta adquirir el mismo bloqueo antes de que el subproceso A lo libere.Lock contention usually occurs when thread A acquires a lock and thread B tries to acquire the same lock before thread A releases it.

Código de carga ([COLD])Loading code ([COLD])

Si el nombre del método contiene [COLD] , por ejemplo, mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined, significa que el entorno en tiempo de ejecución de .NET Framework es la primera vez que ejecuta código que no está optimizado mediante la optimización guiada por perfiles.If the method name contains [COLD], such as mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined, .NET Framework runtime is executing code for the first time that isn't optimized by profile-guided optimization. Para cada método, debe presentarse como máximo una vez durante el proceso.For each method, it should be displayed at most once during the process.

Si el código de carga tarda una cantidad de tiempo considerable con una solicitud, significa que la solicitud es la primera en ejecutar la parte no optimizada del método.If loading code takes a substantial amount of time for a request, the request is the first one to execute the unoptimized portion of the method. Considere la posibilidad de usar un proceso de preparación que ejecute esa parte del código antes de que los usuarios accedan e él.Consider using a warmup process that executes that portion of the code before your users access it.

Envío de una solicitud HTTPSend HTTP request

Métodos como HttpClient.Send indican que el código está esperando a que finalice una solicitud HTTP.Methods such as HttpClient.Send indicate that the code is waiting for an HTTP request to be completed.

Operación de base de datosDatabase operation

Métodos como SqlCommand.Execute indican que el código está a la espera de que finalice una operación de base de datos.Methods such as SqlCommand.Execute indicate that the code is waiting for a database operation to finish.

Espera (AWAIT_TIME)Waiting (AWAIT_TIME)

AWAIT_TIME indica que el código está a la espera de que finalice otra tarea.AWAIT_TIME indicates that the code is waiting for another task to finish. Este retraso sucede normalmente con la instrucción AWAIT de C#.This delay usually happens with the C# AWAIT statement. Cuando el código efectúa una instrucción AWAIT de C#, el subproceso se desenreda y devuelve el control al grupo de subprocesos, y no hay ningún subproceso bloqueado a la espera de que finalice AWAIT.When the code does a C# AWAIT, the thread unwinds and returns control to the thread pool, and there's no thread that is blocked waiting for the AWAIT to finish. Pero, lógicamente, el subproceso que realizó AWAIT está "bloqueado" a la espera de que finalice la operación.However, logically, the thread that did the AWAIT is "blocked," and it's waiting for the operation to finish. La instrucción AWAIT_TIME indica el tiempo de bloqueo a la espera de que finalice la tarea.The AWAIT_TIME statement indicates the blocked time waiting for the task to finish.

Tiempo de bloqueoBlocked time

BLOCKED_TIME indica que el código está a la espera de que otro recurso esté disponible.BLOCKED_TIME indicates that the code is waiting for another resource to be available. Por ejemplo, podría estar esperando un objeto de sincronización, a que un subproceso esté disponible o a que termine una solicitud.For example, it might be waiting for a synchronization object, for a thread to be available, or for a request to finish.

Async no administradaUnmanaged Async

.NET Framework emite eventos ETW y pasa identificadores de actividad entre subprocesos para que se pueda realizar un seguimiento de las llamadas asincrónicas entre subprocesos..NET framework emits ETW events and passes activity ids between threads so that async calls can be tracked across threads. Tanto al código no administrado (código nativo) como a algunos estilos anteriores les faltan estos eventos e identificadores de actividad, de modo que el generador de perfiles no puede informar sobre qué subproceso y qué funciones se ejecutan en el subproceso.Unmanaged code (native code) and some older styles of asynchronous code are missing these events and activity ids, so the profiler cannot tell what thread and what functions are running on the thread. Esto se etiqueta como "Async no administrada" en la pila de llamadas.This is labeled 'Unmanaged Async' in the call stack. Si descarga el archivo ETW, es posible que pueda usar PerfView para obtener más información sobre lo que sucede.If you download the ETW file, you may be able to use PerfView to get more insight into what is happening.

Tiempo de CPUCPU time

La CPU está ocupada ejecutando las instrucciones.The CPU is busy executing the instructions.

Tiempo de discoDisk time

La aplicación está ejecutando operaciones de disco.The application is performing disk operations.

Tiempo de redNetwork time

La aplicación está ejecutando operaciones de red.The application is performing network operations.

Columna CuándoWhen column

La columna Cuándo es una visualización de cómo varían con el tiempo las muestras INCLUSIVAS recopiladas para un nodo.The When column is a visualization of how the INCLUSIVE samples collected for a node vary over time. El intervalo total de la solicitud se divide en 32 depósitos de tiempo.The total range of the request is divided into 32 time buckets. Las muestras inclusivas para ese nodo se acumulan en esos 32 depósitos.The inclusive samples for that node are accumulated in those 32 buckets. Cada depósito se representa con una barra.Each bucket is represented as a bar. El alto de la barra representa un valor escalado.The height of the bar represents a scaled value. En el caso de nodos marcados CPU_TIME o BLOCKED_TIME, o cuando existe una relación obvia de consumo de un recurso (por ejemplo, CPU, disco o subproceso), la barra representa el consumo de uno de esos recursos durante el depósito.For nodes that are marked CPU_TIME or BLOCKED_TIME, or where there is an obvious relationship to consuming a resource (for example, a CPU, disk, or thread), the bar represents the consumption of one of the resources during the bucket. Para estas métricas, puede obtener un valor superior al 100 % si consume varios recursos.For these metrics, it's possible to get a value of greater than 100 percent by consuming multiple resources. Por ejemplo, si por término medio usa dos CPU a lo largo de un intervalo, consigue el 200 %.For example, if you use, on average, two CPUs during an interval, you get 200 percent.

LimitacionesLimitations

El período de retención de datos predeterminado es de cinco días.The default data retention period is five days. El número máximo de datos ingerido al día es de 10 GB.The maximum data that's ingested per day is 10 GB.

No hay ningún cargo por el uso del servicio Profiler.There are no charges for using the Profiler service. Para poder usarlo, la aplicación web debe estar hospedada al menos en el nivel básico de la característica Web Apps de Azure App Service.For you to use it, your web app must be hosted in at least the basic tier of the Web Apps feature of Azure App Service.

Sobrecarga y algoritmo de muestreoOverhead and sampling algorithm

Profiler se ejecuta de manera aleatoria dos minutos cada hora en cada máquina virtual que hospede la aplicación que tiene habilitado Profiler para capturar seguimientos.Profiler randomly runs two minutes every hour on each virtual machine that hosts the application that has Profiler enabled for capturing traces. Al ejecutarse Profiler, agrega una sobrecarga de la CPU del 5 al 15 % al servidor.When Profiler is running, it adds from 5 to 15 percent CPU overhead to the server.

Pasos siguientesNext steps

Habilite Application Insights Profiler para la aplicación de Azure.Enable Application Insights Profiler for your Azure application. Consulte también:Also see: