Solución de problemas de uso elevado de CPU en un grupo de aplicaciones de IIS
Se aplica a: Internet Information Services
Este solucionador de problemas le ayudará a identificar la causa de una CPU elevada sostenida en un grupo de aplicaciones de Internet Information Services (IIS). Es importante tener en cuenta que es normal que el uso de CPU aumente, ya que una aplicación web atiende solicitudes. Sin embargo, si ve que la CPU permanece constantemente en un nivel alto (en el rango del 80 % o superior) durante periodos prolongados, el rendimiento de la aplicación sufrirá. Por esa razón, es importante comprender la causa de una CPU elevada sostenida para que se pueda solucionar y corregir si es posible.
Escenario
Un grupo de aplicaciones en IIS está experimentando un periodo prolongado de uso de CPU elevado que supera el 90 %. Cuando se prueba la aplicación, no se producen problemas. Sin embargo, una vez que la aplicación experimenta la carga real del usuario, el uso de CPU sube a un alto porcentaje y se mantiene. Para recuperarse, se debe reiniciar el grupo de aplicaciones, pero después de hacerlo, la CPU vuelve a subir a un nivel alto.
Herramientas
- Diagnósticos de depuración (DebugDiag)
- Monitor de rendimiento (Perfmon)
Recolección de datos
Lo primero que debe hacer cuando encuentre problemas de uso elevado de cpu es determinar el proceso que consume cpu. Puede usar la pestaña Procesos del Administrador de tareas para hacerlo. Asegúrese de activar la casilla Mostrar procesos de todos los usuarios . En la imagen siguiente se muestra esta casilla activada y se muestra el w3wp.exe
proceso (el proceso que hospeda un grupo de aplicaciones de IIS) que consume un alto nivel de CPU.
También puede usar el Monitor de rendimiento para determinar qué proceso usa la CPU. Para obtener más información sobre el uso de Monitor de rendimiento, consulte Análisis de datos de rendimiento.
Sugerencia
Si necesita identificar qué grupo de aplicaciones está asociado a un proceso de w3wp.exe determinado, abra un símbolo del sistema administrativo, cambie a la %windir%\System32\inetsrv
carpeta cd %windir%\System32\inetsrv
y ejecute appcmd list wp
. Se mostrará el identificador de proceso (PID) del proceso de w3wp.exe entre comillas. Puede hacer coincidir ese PID con el PID disponible en el Administrador de tareas.
Una vez que haya confirmado que un proceso de w3wp.exe está experimentando una CPU elevada, deberá recopilar la siguiente información para determinar lo que está causando el problema:
- Un conjunto de recopiladores de datos del Monitor de rendimiento.
- Un volcado de memoria en modo de usuario del proceso de w3wp.exe.
Ambos deberán recopilarse durante el evento de CPU elevado.
Recopilación de un conjunto de recopiladores de datos de Monitor de rendimiento
Monitor de rendimiento los datos suelen ser críticos para determinar la causa de problemas elevados de CPU. También puede ser muy útil para obtener una perspectiva general de cómo funciona la aplicación.
Los datos de Perfmon se pueden ver en tiempo real o se pueden recopilar en un conjunto de recopiladores de datos que se puede revisar más adelante. Para solucionar un problema de uso de CPU elevado, es necesario recopilar un conjunto de recopiladores de datos. Para crear un conjunto de recopiladores de datos para solucionar problemas de uso de CPU elevado, siga estos pasos.
- Abra Herramientas administrativas desde el Panel de control de Windows.
- Haga doble clic en Monitor de rendimiento.
- Expanda el nodo Conjuntos de recopiladores de datos.
- Haga clic con el botón derecho en Definido por el usuario y seleccione Nuevo ->Conjunto de recopiladores de datos.
- Escriba Cpu alta como nombre del conjunto de recopiladores de datos.
- Seleccione Crear manualmente (avanzado).
- Seleccione Siguiente.
- Seleccione Crear registros de datos.
- Active la casilla Contador de rendimiento.
- Seleccione Siguiente.
- Seleccione Agregar. Si la aplicación no es una aplicación ASP.NET, vaya al paso 19.
- Desplácese hasta la parte superior de la lista de contadores y seleccione Memoria clR de .NET.
- En la lista de instancias, seleccione <todas las instancias>.
- Seleccione Agregar para agregar los contadores a la lista de contadores agregados.
- Seleccione ASP.NET en la lista de contadores y, a continuación, seleccione Agregar.
- Seleccione ASP.NET Aplicaciones en la lista de contadores.
- Seleccione <todas las instancias> de la lista de instancias.
- Seleccione Agregar.
- Expanda Proceso en la lista de contadores. (Asegúrese de expandir Procesar y no procesador).
- Seleccione % de tiempo de procesador en el objeto Process .
- Seleccione <todas las instancias> de la lista de instancias.
- Seleccione Agregar.
- Expanda Subproceso en la lista de contadores.
- Seleccione % de tiempo de procesador en el objeto Thread .
- Seleccione <todas las instancias> de la lista de instancias.
- Seleccione Agregar.
- Seleccione Id. Subproceso en la lista de instancias.
- Seleccione Agregar.
El cuadro de diálogo debería tener ahora un aspecto similar al de la imagen siguiente.
Seleccione Aceptar ->Siguiente. Apunte dónde se guarda el conjunto de recopiladores de datos. (Puede cambiar esta ubicación si es necesario). A continuación, seleccione Finalizar.
El conjunto de recopiladores de datos aún no se está ejecutando. Para iniciarlo, haga clic con el botón derecho en Cpu alta en el nodo Definido por el usuario y seleccione Iniciar en el menú.
Creación de una regla de diagnóstico de depuración
La manera más fácil de recopilar volcados de proceso en modo de usuario cuando se produce una condición de CPU alta es usar diagnósticos de depuración.
Descargue DebugDiag, instálelo en el servidor y ejecútelo. (Lo encontrarás en el Menú Inicio después de la instalación). Al ejecutar DebugDiag, se mostrará el cuadro de diálogo Seleccionar tipo de regla. Siga estos pasos para crear una regla de bloqueo para el grupo de aplicaciones:
- Seleccione Rendimiento ->Siguiente.
- Seleccione Contadores de rendimiento ->Siguiente.
- Seleccione Agregar desencadenadores de rendimiento.
- Expanda el objeto Procesador (no el proceso) y seleccione % de tiempo de procesador. Tenga en cuenta que si está en Windows Server 2008 R2 y tiene más de 64 procesadores, elija el objeto Información del procesador en lugar del objeto Processor .
- En la lista de instancias, seleccione _Total.
- Seleccione Agregar ->Aceptar.
- Seleccione el desencadenador recién agregado y, a continuación, seleccione Editar umbrales.
- Seleccione Arriba en la lista desplegable.
- Cambie el umbral a 80.
- Escriba 20 para el número de segundos. (Puede ajustar este valor si es necesario, pero tenga cuidado de no especificar un pequeño número de segundos para evitar desencadenadores falsos).
- Seleccione Aceptar.
- Seleccione Siguiente.
- Seleccione Agregar destino de volcado.
- Seleccione Grupo de aplicaciones web en la lista desplegable.
- Seleccione el grupo de aplicaciones en la lista de grupos de aplicaciones.
- Seleccione Aceptar.
- Seleccione Siguiente.
- Seleccione Siguiente de nuevo.
- Escriba un nombre para la regla si lo desea y anote la ubicación donde se guardarán los volcados. Si lo desea, puede cambiar esta ubicación.
- Seleccione Siguiente.
- Seleccione Activar la regla ahora y, a continuación, seleccione Finalizar.
Sugerencia
Puede crear volcados de varios grupos de aplicaciones agregando varios destinos de volcado mediante la misma técnica que se usa en los pasos 13-15.
Esta regla creará 11 archivos de volcado. Los primeros 10 serán "mini volcados" que serán de un tamaño bastante pequeño. El volcado final será un volcado de memoria completa y ese volcado será mucho mayor.
Una vez que se haya producido un problema de uso de CPU elevado, querrá que el conjunto de recopiladores de datos de Perfmon deje de recopilar datos. Para ello, haga clic con el botón derecho en el conjunto de recopiladores de datos de CPU alta que aparece en el nodo Definido por el usuario y seleccione Detener.
Análisis de datos
Después del evento de uso de CPU elevado, habrá dos conjuntos de datos que se van a revisar: el conjunto de recopiladores de datos de Perfmon y los volcados de memoria. Comencemos revisando los datos de Perfmon.
Análisis de los datos de rendimiento
Para revisar los datos de Perfmon del problema, haga clic con el botón derecho en el conjunto recopilador de datos de CPU alta que aparece en el nodo Definido por el usuario y seleccione Informe más reciente. Verá un informe similar a la captura de pantalla siguiente.
Lo primero es quitar todos los contadores actuales para que pueda agregar los explícitos que desea revisar. Seleccione el primer contador de la lista. A continuación, desplácese hasta la parte inferior de la lista y seleccione en el último contador mientras mantiene presionada la tecla MAYÚS. Una vez que haya seleccionado todos los contadores, presione Eliminar tecla para quitarlos.
Ahora agregue el contador Procesar / % de tiempo de procesador con estos pasos:
- Haga clic con el botón derecho en cualquier parte del panel derecho de Perfmon y seleccione Agregar contadores.
- Expanda el objeto Process .
- Seleccione % de tiempo de procesador en la lista.
- Seleccione <todas las instancias> de la lista de instancias.
- Seleccione Agregar.
- Seleccione Aceptar.
Aparecerá una pantalla que muestra un gráfico del tiempo de procesador utilizado por cada proceso del equipo durante el tiempo en que se estaba ejecutando el conjunto de recopiladores de datos. La manera más fácil de aislar qué proceso usaba el nivel más alto de CPU es habilitar la característica de resaltado de Perfmon.
Para ello, seleccione el primer contador de la lista y presione Ctrl + H. Una vez hecho esto, el proceso seleccionado se mostrará como una línea negra en negrita en el gráfico.
Use la flecha hacia abajo del teclado para desplazarse por la lista de procesos hasta que encuentre el proceso que muestra el uso más elevado de la CPU. En la captura de pantalla siguiente, puede ver claramente que el proceso de w3wp.exe estaba usando una gran cantidad de CPU en la máquina. Esto confirma que el grupo de aplicaciones de IIS está causando un uso elevado de la CPU en el equipo.
Sugerencia
Perfmon puede ser muy útil para determinar los problemas de rendimiento en la aplicación. Los datos recopilados en el registro de Perfmon pueden mostrar cuántas solicitudes se están ejecutando (mediante los objetos ASP.NET y Aplicaciones ASP.NET) y también puede mostrar otros datos de rendimiento importantes sobre cómo funciona la aplicación.
Para llegar a la raíz de lo que está provocando el problema elevado de CPU, vamos a revisar los volcados creados con DebugDiag.
Análisis de volcado de memoria con DebugDiag
DebugDiag tiene la capacidad de reconocer muchos problemas mediante un análisis de volcado automatizado. Para este problema concreto, los analizadores de rendimiento de DebugDiag son adecuados para ayudar a identificar la causa principal del problema de CPU elevado. Para usar el analizador, siga estos pasos
- Seleccione la pestaña Análisis avanzado en DepuraciónDiag.
- Seleccione los Analizador de rendimiento.
- Seleccione Agregar archivos de datos.
- Explorador a la ubicación donde se crearon los volcados. De forma predeterminada, se trata de una subcarpeta de la carpeta C:\Archivos de programa\DepurarDiag\Logs .
- Seleccione uno de los volcados de memoria y presione Ctrl + A para seleccionar todos los volcados de memoria de esa carpeta.
- Seleccione Open (Abrir).
- Seleccione Iniciar análisis.
DepurarDiag tarda unos minutos en analizarse a través de los volcados de memoria y proporcionar un análisis. Cuando se completa el análisis, verá una página similar a la que se muestra en la imagen siguiente.
Observe que la parte superior del informe indica que se detectó una CPU alta. En la columna derecha, verá recomendaciones que incluyen un vínculo a los 7 subprocesos principales por tiempo medio de CPU. Seleccione ese vínculo y verá información sobre lo que hacían los principales consumidores de CPU. Por ejemplo, en la captura de pantalla siguiente se muestra lo que hacen esos subprocesos en mi aplicación.
En este ejemplo, se ejecuta la página default.aspx de la aplicación FastApp. Si busca más abajo la pila de llamadas (en la parte inferior de la página), puede ver que este subproceso está realizando la concatenación de cadenas. (Observe la llamada a System.String.Concat
en la pila de llamadas). Si analiza los otros subprocesos de CPU principales, verá el mismo patrón.
El siguiente paso es revisar el Page_Load
evento en la página default.aspx de la aplicación FastApp. Al hacerlo, encuentro el siguiente código.
htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";
Este tipo de código sin duda causará un uso de CPU elevado.
Conclusión
Con Perfmon y DebugDiag, puede recopilar fácilmente datos que pueden resultar útiles para determinar la causa de un uso de CPU elevado en los grupos de aplicaciones. Si no encuentra la causa principal mediante estas técnicas, puede ponerse en contacto con el soporte técnico de Microsoft para obtener más ayuda. Los ingenieros de soporte técnico de Microsoft pueden ayudarle a determinar la causa del problema. Al tener listos los datos y volcados de perfmon al abrir un caso, reducirá drásticamente la cantidad de tiempo necesario para que los ingenieros le ayuden.