JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo determinar qué servicio está ocupando toda la CPU en mi servidor

Los caminos de Windows, a veces, son inescrutables.

En ocasiones, sin saber por qué, en un servidor en producción un proceso empieza a "comerse" todos los recursos del procesador y no tenemos idea de a qué se puede deber (una actualización, un driver, un programa nuestro que se ha desbocado...). Y lo que es peor: si se trata de algún servicio del sistema lo tenemos más difícil pues todos los procesos de ese estilo se llaman igual: svchost.exe.

svchost-01

svchost.exe es un proceso genérico del sistema que sirve para ejecutar DLLs de Windows. Generalmente contienen servicios. Además para evitar que la caída de un servicio afecte a todo el sistema se lanza un svchost.exe por cada grupo de servicios relacionados. Así, por ejemplo, todos los que tienen que ver con servicios de red van en uno, con seguridad en otro, con IIS en otro, etc...

¿Cómo podemos averiguar cuál es el verdadero servicio que nos está causando el problema?

Existen varias maneras.

1.- La fácil: verlos directamente en el administrador de tareas

A la mayoría de los mortales nos gusta ver de manera gráfica la información y tener una interfaz de usuario para hacer las tareas. Por suerte es muy fácil averiguar esta información tanto en versiones modernas como en versiones antiguas de Windows también.

En primer lugar, en Windows Server 2012 (o Windows 8.x), el administrador de tareas nos da mucha más información con cada proceso, por lo que es muy sencillo:

svchost-05

Pulsa para aumentar

Fíjate en que además de decirnos simplemente que es un "Service host", nos indica también qué servicios corren en ese proceso y podemos desplegarlo para ver el detalle concreto de dichos servicios. Muy útil.

Sin embargo en versiones anteriores de Windows (Windows 7, Windows Server 2008 y 2008 R2, etc...) la información es más escasa y es la que se ve en la primera figura.

En estos sistemas antiguos basta con pulsar con el botón secundario en el proceso svchost.exe desbocado y escoger la opción "Ir al servicio(s)" del menú contextual:

svchost-02

Esto abrirá la pestaña "Servicios" que tendrá seleccionados los servicios que se están ejecutando bajo ese proceso concreto:

svchost-03

De este modo podremos averiguar cuál es el servicio que nos está causando problemas y, si es posible, pararlo o reiniciarlo para solucionar el asunto.

2.- La difícil: listarlos a través de la línea de comandos

Lo anterior está bien en la mayor parte de los casos, pero para los que se sientan más "hackers" y les guste hacerlo desde la línea de comandos o, lo más probable, si utilizas una edición "server core" de Windows, sin interfaz de usuario (que puede ser útil para aprovechar al máximo el hardware en Data Centers y máquinas virtuales de propósito específico), entonces en ese caso debes ir a través de la línea de comandos del sistema.

Primeramente ¿cómo sabes desde línea de comandos que un proceso está apropiándose de la memoria o de la CPU?

Pues por ejemplo usando el comando tasklist con el parámetro /v para que de información detallada de los procesos. Si abrimos una línea de comandos (cmd.exe) y escribimos lo siguiente:

tasklist /v

obtendremos una lista de todos los procesos del sistema que nos mostrará la memoria que están consumiendo y el tiempo que han ocupado en la CPU del sistema desde que se arrancó. No nos dice el % de procesador que está consumiendo de manera instantánea pero ese tiempo de CPU nos permite saber si alguno está acaparando demasiado los recursos del procesador.

Si estamos buscando servicios desbocados será más útil si además le aplicamos un filtro para que solo nos muestre los procesos svchost.exe:

tasklist /v /fi "IMAGENAME eq svchost.exe"

Además podemos volcar esa información a un archivo (e incluso enviárnoslo por email o descargarlo por FTP) para estudiar la información  con más calma si ponemos un "> NombreArchivo.txt" al final.

Una vez ya hemos identificado desde la línea de comandos qué proceso está acaparando recursos, podemos ver con detalle qué servicios tiene dentro usando de nuevo el mismo comando pero con el parámetro /svc que lista los servicios asociados al proceso:

tasklist /svc /fi "IMAGENAME eq svchost.exe"

Con ello obtendremos un listado de todos los procesos de nombre svchost.exe con un detalle de los servicios que contienen:

svchost-04

Con esto podemos ver qué servicios están atados a cada proceso y así identificar los que están dando la lata.

¡Espero que te sea útil!

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (3) -

Gracias amigo, me ayudó bastante
Un abrazo!

Responder

Gracias. Tnego una pregunta: si quiero solo extraer columnas especificas, ejemplo: Session name, Mem Usage Status User Name CPU Time  como puedo hacerlo.

Responder

by Jose M. Alarcon

Hola:

El comando taskist tiene una opción /FO que te permite especificar en qué formato quieres sacar la información. Uno de los formatos es "CSV", por lo que si escribes:

tasklist /svc /fi "IMAGENAME eq svchost.exe" /FO csv > D:\procesos.csv

te creará un archivo CSV de valores separados con comas en la ruta que le indiques (en mi ejemplo en la raíz de la unidad D:\). Este archivo lo puedes abrir con Excel y luego ya filtras las columnas como quieras, eliminas las que te sobren, etc...

Saludos.

Responder

Agregar comentario