Solución de problemas de CPU elevada en un grupo de aplicaciones de IIS
Se aplica a: Internet Information Services
Este solucionador de problemas le ayudará a identificar la causa del uso elevado de CPU en un grupo de aplicaciones de Internet Information Services (IIS). Es importante tener en cuenta que es normal que el uso de CPU aumente a medida que una aplicación web atiende solicitudes. Sin embargo, si observa que la CPU permanece en un nivel alto (en el área del 80 % o superior) durante períodos prolongados, el rendimiento de la aplicación se verá afectado. Por ese motivo, es importante comprender la causa de una CPU elevada sostenida para que se pueda abordar y corregir si es posible.
Escenario
Un grupo de aplicaciones de IIS está experimentando un período prolongado de cpu alta que supera el 90 %. Cuando se prueba la aplicación, no se encuentra ningún problema. Sin embargo, una vez que la aplicación experimenta la carga real del usuario, la CPU aumenta a un porcentaje alto y permanece. Para recuperarse, el grupo de aplicaciones debe reiniciarse, pero después de hacerlo, la CPU vuelve a subir a un nivel alto.
Herramientas
- Diagnóstico de depuración (DebugDiag)
- Monitor de rendimiento (Perfmon)
Recolección de datos
Lo primero que debe hacer cuando se producen problemas elevados de uso de CPU es determinar el proceso que consume CPU. Para ello, puede usar la pestaña Procesos en el Administrador de tareas. Asegúrese de seleccionar 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 IIS) que consume un alto nivel de CPU.
También puede usar 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
. Esto 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 qué está causando el problema:
- Un conjunto de recopilador de datos Monitor de rendimiento.
- Volcado de memoria en modo de usuario del proceso de w3wp.exe.
Ambos tendrán que recopilarse durante el evento de CPU elevada.
Recopilación de un conjunto de recopilador de datos Monitor de rendimiento
Monitor de rendimiento datos suele ser fundamental para determinar la causa de problemas elevados de CPU. También puede ser muy útil para obtener una vista 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 recopilador de datos que se puede revisar más adelante. Para solucionar un problema de CPU elevado, es necesario recopilar un conjunto de recopilador de datos. Para crear un conjunto de recopilador de datos para solucionar problemas de CPU elevada, siga estos pasos.
- Abra Herramientas administrativas desde la 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 recopilador 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, continúe con el 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 desde la lista de contadores. (Asegúrese de expandir Proceso y no Procesador).
- Seleccione % Tiempo de procesador en el objeto Process .
- Seleccione <todas las instancias> de la lista de instancias.
- Seleccione Agregar.
- Expanda Subproceso de 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 Subproceso de identificador en la lista de instancias.
- Seleccione Agregar.
El cuadro de diálogo debería tener ahora un aspecto similar al de la siguiente imagen.
Seleccione Aceptar ->Siguiente. Anote 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 recopilador 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á 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 % 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 de memoria.
- 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.
- Vuelva a seleccionar Siguiente .
- Escriba un nombre para la regla si lo desea y anote la ubicación donde se guardarán los volcados. Puede cambiar esta ubicación si lo desea.
- 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 de memoria mediante la misma técnica usada en los pasos 13-15.
Esta regla creará 11 archivos de volcado de memoria. Los primeros 10 serán "mini volcados" que serán bastante pequeños en tamaño. El volcado final será un volcado con memoria completa y esos volcados serán mucho más grandes.
Una vez que se haya producido el problema de CPU elevada, querrá impedir que el conjunto de recopiladores de datos Perfmon recopile datos. Para ello, haga clic con el botón derecho en el conjunto de recopiladores de datos cpu alta que aparece en el nodo Definido por el usuario y seleccione Detener.
Análisis de datos
Después del evento de CPU alta, tendrá dos conjuntos de datos que revisar; el conjunto de recopiladores de datos Perfmon y los volcados de memoria. Comencemos por revisar los datos de Perfmon.
Análisis de datos de rendimiento
Para revisar los datos de Perfmon para el problema, 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 Informe más reciente. Verá un informe similar a la siguiente captura de pantalla.
Lo primero es quitar todos los contadores actuales para que pueda agregar los explícitos que quiera 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 la tecla Eliminar para quitarlos.
Ahora agregue el contador Process / % Processor Time con estos pasos:
- Haga clic con el botón derecho en cualquier lugar 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.
Ahora tendrá una pantalla que muestra un gráfico del tiempo de procesador utilizado por cada proceso en el equipo durante el tiempo 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.
Usa la flecha abajo del teclado para desplazarte hacia abajo por la lista de procesos hasta que encuentres el proceso que muestra la mayor cantidad de uso de CPU. En la captura de pantalla siguiente, puede ver claramente que el proceso de w3wp.exe usaba una gran cantidad de CPU en el equipo. Esto confirma que el grupo de aplicaciones 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 perfmon pueden mostrar cuántas solicitudes se están ejecutando (mediante los objetos ASP.NET y ASP.NET Applications) y también pueden mostrar otros datos de rendimiento importantes sobre el rendimiento de la aplicación.
Para llegar a la raíz de lo que provoca el problema de CPU elevada, vamos a revisar los volcados que se crearon mediante 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 elevada. Para usar el analizador, siga estos pasos.
- Seleccione la pestaña Análisis avanzado en DebugDiag.
- Seleccione los Analizadores de rendimiento.
- Seleccione Agregar archivos de datos.
- Explorador a la ubicación donde se crearon los volcados. De forma predeterminada, esta será una subcarpeta de la carpeta C:\Archivos de programa\DebugDiag\Logs .
- Seleccione uno de los volcados y, a continuación, presione Ctrl + A para seleccionar todos los volcados de memoria de esa carpeta.
- Seleccione Abrir.
- Seleccione Iniciar análisis.
DebugDiag tarda unos minutos en analizar los volcados y proporcionar un análisis. Cuando complete el análisis, verá una página similar a la que se muestra en la siguiente imagen.
Observe que en la parte superior del informe se indica que se detectó una CPU elevada. En la columna derecha, verá recomendaciones que incluyen un vínculo a los 7 subprocesos principales por promedio de tiempo 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 está ejecutando la página default.aspx de la aplicación FastApp. Si examina 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 principales de CPU, 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. Cuando lo hago, encuentro el código siguiente.
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 definitivamente provocará un uso elevado de la CPU.
Conclusión
Con Perfmon y DebugDiag, puede recopilar fácilmente datos que pueden ser útiles para determinar la causa del uso elevado de CPU 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 los datos y volcados de Perfmon listos al abrir un caso, reducirá drásticamente la cantidad de tiempo necesario para que los ingenieros le ayuden.