100% CPU w3wp.exe

Este es un problema al que alguna vez muchos de nosotros nos hemos tenido que enfrentar, yo hacia casi 3 años que no tenía este problema, pero este último mes ha resultado que me ha sucedido en 2 ocasiones en 2 proyectos totalmente diferentes, de empresas diferentes y ambos estables (1 lleva un año trabajando con una gran cantidad de usuarios y otro más de 4 sin dar ningún problema).

¿Como actuar? ¿Que hacer? ¿Es software o hardware? Estas son las preguntas típicas cuando detectamos este problema, voy a intentar describir unos pasos para poder determinar el porqué del problema.

Sintoma:
     El proceso w3wp.exe automenta el consumo de CPU, muchas veces sin ningun tipo de pauta, sube, baja pero siempre vuelve durante mucho rato a un excesivo uso de CPU.

Identificar que falla:
     1. Primeramente hemos de indentificar que site es la que nos esta dando problemas, para ello crearemos si no lo tenemos ya, un pool para cada una.
     2. Ejecutamos el comando ‘iisapp’ en caso de estar en un entorno Win 2003 o si estamos en un entorno Win 2008, nos vamos directamente al IIS y clicamos sobre Worker Process.
     3. Llegados a este punto sabemos que aplicación nos esta dando problemas.

     4. Ahora podriamos plantearnos si hemos realizado algún cambio reciente, o si este problema se ha originado a una hora concreta, debiendo revisar a que hora comenzo y con que proceso tiene relación.
     5. Utilizar una herramienta para determinar que esta haciendo subir la CPU, normalente, la CPU sube porque estamos haciendole hacer a la máquina más cálculos de los normales, o alguno de ellos tiene un coste excesivo. Encontrar donde se encuentra este fallo, es la dificultad. Yo he utilizado 2 herramientas, logparser y JetBrains para localizar el problema.

LOGPARSER:
Es una aplicación que nos permite parsear el log del IIS, pudiendo determinar que página es la que más le esta costando procesar, así como ver rápidamente si una IP nos esta haciendo un ataque de denegación de servicio, que podría ser una causa de este sintoma. También podemos comparar número de peticiones de otro día para ver si son coherentes los datos, o llegar a ver exactamente la petición que nos están realizando.

JETBRAINS DOTTRACER:
Esta es una aplicación muy interesante, de la cual encontramos diferentes versiones, una de ellas demo válida para 30 días, que ayudará más que la anterior. Su uso es bastante simple, iniciamos, indicamos que queremos hacer un Profiling de una aplicación web, y cuando deseemos obtenemos los resultados. Podremos llegar a ver que llamadas a realizado nuestro código, viendo el tanto por ciento de tiempo que se esta llevando cada proceso. El resultado nos puede ayudar a identificar que hay un bucle que esta quedandose colgado, o que estamos llamado demasiadas veces a un proceso muy costos.

Resolver el problema:
     En mi caso 1)
El problema vino debido a que en un bucle estaba llamando unas 200 veces a algo parecido a esto:

For i as Integer = 0 to 200
     Me.Label1.Text = Me.Label1.Text + “hola”
next

Esto que parece tan simple, tiene un coste exagerado para .Net (no se muy bien porque, si alguién lo tiene claro que me lo explique)

SOLUCIÓN:
   
   StringBuilder Aux = new StringBuilder()
      Aux.Append(Me.Label1.Text)
     For i as Integer = 0 to 200
             Aux.Append(“hola”)
     next

     En mi caso 2) El problema surgio debido a un proceso de caducidad, que hizo que un bucle no tuviese final, algo tan sencillo fueron más de 12 horas buscando el problema.

 

Espero que esta información os sirva de guia ante un caso similar, y sobretodo os aconsejo utilizar el Jet Brains.

3 comentarios en “100% CPU w3wp.exe”

  1. El coste viene porque las cadenas en .NET son inmutables, es decir, ese += lo que hace es crear, en cada iteración, una nueva cadena, copia la antigua a la nueva y luego añade la siguiente.

    El coste se incrementa según crece la cadena, y para eso está el StringBuilder. Si vas a hacer más de diez concatenaciones sobre una cadena, usa un StringBuilder.

    Por otro lado, esas son la tareas típicas para hacerlas en un hilo aparte y no en el principal…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *