Me he encontrado en mas de un caso, (en portátiles) que cada 3 o 4 segundos la CPU tiene pico sin sentido hasta un 7%. Si no hay nada ejecutándose, ¿a qué y por qué existe ese comportamiento periódico de consumo?
Además en las maquinas que esto sucede, algunas veces se reinician solas sin dump. Parecen problemas independientes pero veamos si ligazón.
En ese caso, al no existir dump, lo único que puede verse es el fallo en:
Esto nos da una pista. El services.exe se cae y provoca reinicio sin poder hacer un dump. Todos los servicios del sistema se caen. Evidentemente el services.exe arranca decenas de procesos y parece difícil ver algo.
Arrancamos un process explorer y nos dedicamos a observar... vemos que curiosamente el consumo "periódico" que hemos citado antes sucede en dicho proceso.
Podemos comprobar que además justo en ese momento TODAS (o casi) las tareas que dependen de él, consumen un poco de CPU. Unos porcentajes ridículos, pero que sumandos dan ese 5% o 6% periódico que se observa.
¿por qué todos a la vez, y luego nada durante dos o tres segundos?.
Y curiosamente, cuando esto sucede, el WmiPrvSE es el que mas consumo tiene. La idea que se me ocurrió es ¿no será precisamente este proceso el que bloquea el services.exe -como si pusiese un semáforo- y cuando se libera es cuando entran de repente los pendientes? Si esto es así. no será ese bloqueo el responsable de los reinicios de maquina?
Curiosamente la respuesta es que si, ya que si reiniciamos dicho servicio no vuelve a suceder ninguno de los problemas, ni el consumo periódico de CPU ni los reinicios. Es como si el servicio Windows Management Instrumentation (que corresponde a WmiPrvSE) y que tiene mas de media docena de dependientes tiene algún problema en el establecimiento de los bloqueos o semáforos en el sistema. Se pueden ver los dependientes reiniciando el servicio (que informa de ellos) o bien mediante este comando de PowerShell:
La solución pasa entonces por parar y reiniciar dicho serivcio en cada arranque de maquina. Pero ¿podríamos mecanizarlo?. Por supuesto, por ejemplo mediante este script de powershell:
¿os ha gustado?...
Además en las maquinas que esto sucede, algunas veces se reinician solas sin dump. Parecen problemas independientes pero veamos si ligazón.
En ese caso, al no existir dump, lo único que puede verse es el fallo en:
Spoiler: mostrar
Esto nos da una pista. El services.exe se cae y provoca reinicio sin poder hacer un dump. Todos los servicios del sistema se caen. Evidentemente el services.exe arranca decenas de procesos y parece difícil ver algo.
Arrancamos un process explorer y nos dedicamos a observar... vemos que curiosamente el consumo "periódico" que hemos citado antes sucede en dicho proceso.
Spoiler: mostrar
Podemos comprobar que además justo en ese momento TODAS (o casi) las tareas que dependen de él, consumen un poco de CPU. Unos porcentajes ridículos, pero que sumandos dan ese 5% o 6% periódico que se observa.
¿por qué todos a la vez, y luego nada durante dos o tres segundos?.
Y curiosamente, cuando esto sucede, el WmiPrvSE es el que mas consumo tiene. La idea que se me ocurrió es ¿no será precisamente este proceso el que bloquea el services.exe -como si pusiese un semáforo- y cuando se libera es cuando entran de repente los pendientes? Si esto es así. no será ese bloqueo el responsable de los reinicios de maquina?
Curiosamente la respuesta es que si, ya que si reiniciamos dicho servicio no vuelve a suceder ninguno de los problemas, ni el consumo periódico de CPU ni los reinicios. Es como si el servicio Windows Management Instrumentation (que corresponde a WmiPrvSE) y que tiene mas de media docena de dependientes tiene algún problema en el establecimiento de los bloqueos o semáforos en el sistema. Se pueden ver los dependientes reiniciando el servicio (que informa de ellos) o bien mediante este comando de PowerShell:
Código:
get-service winmgmt -DependentServices
Código:
function reset_wmi { # guardar lista de dependencias y estado del wmiApsrv $dependencies = get-service winmgmt -DependentServices | Where-Object{ $_.Status -eq "Running" } $stwmiadapter = get-service wmiApsrv | Where-Object{ $_.Status -eq "Running" } # fuerza parada de servicios Stop-Service "Winmgmt" -force -ErrorAction Ignore Stop-Service "wmiApSrv" -force -ErrorAction Ignore # matar los procesos que continuen en ejecucion Get-Process "WmiPrvSE" | Stop-Process -Force -ErrorAction Ignore Get-Process "WmiApSrv" | Stop-Process -Force -ErrorAction Ignore # restart servicios Start-Service "Winmgmt" $stwmiadapter | Start-Service -ErrorAction Ignore $dependencies | Start-Service -ErrorAction Ignore } # registrar el Event Log si fuese necesario $es = "WMI Watchdog Script" if (!(Get-Eventlog -LogName "Application" -Source $es -ErrorAction Ignore )) { New-Eventlog -LogName "Application" -Source $es } Write-EventLog -LogName Application -source $es -EntryType Information -EventId 1 -Message "Reiniciando WMI servicios..." try { reset_wmi 2>&1 | Out-Null Write-EventLog -LogName Application -source $es -EntryType Information -EventId 2 -Message "WMI reset completado. Consulta WMI." gwmi -Class Win32_Service -ErrorAction Stop | Out-Null } catch { Write-EventLog -LogName Application -source $es -EntryType Error -EventId 101 -Message "WMI reset fallado: $($_.exception.message)" }
Comentario