Como detectar procesos que hacen uso excesivo de CPU y RAM en Linux

por


Publicado en: septiembre 28, 2018



En este articulo explicaremos como detectar procesos que utilizan gran cantidad de CPU y RAM, utilizando los comandos top y ps.

En Linux tenemos una gran cantidad de procesos en ejecución, estos pueden ser programas, servicios y demás, un proceso también puede depender de otro como un proceso padre, estos pueden heredar atributos tales como roles, permisos, propietario, archivos y demás.

Cada proceso también tiene su propio identificador único llamado PID Process identification number, este puede cambiar si el proceso se termina y luego se vuelve a iniciar. Ahora bien, una manera fácil de identificar los procesos que se están ejecutando en nuestro sistema es utilizando el comando top, con el cual, mediante una interfaz de texto podemos ver un listado de procesos que se están ejecutando en el sistema en tiempo real, con una serie de parámetros de información, además esta interfaz nos muestra información sobre el estado del sistema en general, como vemos a continuación ejecutando el siguiente comando:

[[email protected] ~]# top

En la primera línea obtenemos los siguientes datos sobre la actividad y carga del sistema:

  • Hora: Hora actual del sistema.
  • Up: Tiempo del sistema encendido.
  • Users: Cantidad de usuarios.
  • Load average: Cantidad de carga promedio en intervalos de 5-10-15 minutos.

En la segunda línea obtenemos información sobre las tareas o procesos:

  • Tasks: Cantidad de tareas y procesos del sistema en total.
  • Running: Procesos en ejecución de forma activa, (Se identifican con la letra R).
  • Sleeping: Procesos en espera para su ejecución, (Se identifican con la letra S).
  • Stopped: Ejecución de procesos próximos a detenerse, (Se identifican con la letra T).
  • Zombie: Estos procesos no se están ejecutando, ya que su proceso padre muere, (Se identifican con la letra Z).

En la tercer line obtenemos Informacion del CPU:

  • us: Tiempo de CPU de usuario.
  • sy: Tiempo de CPU del kernel.
  • ni: Tiempo de CPU del usuario con nice positivo.
  • id: Tiempo de CPU para procesos inactivos.
  • wa: Tiempo de CPU para procesos en espera.
  • hi: Interrupciones de hardware.
  • si: Tiempo de CPU en interrupciones de hardware.
  • st: Especifico para maquinas virtuales, indica el tiempo de espera en cola de ejecución de acuerdo al tiempo de procesamiento del hypervisor.

En la cuarta y quinta línea obtenemos informacion sobre la Memoria:

En la última línea obtenemos información sobre los procesos con los siguientes parámetros de información:

  • PID: Identificador único para el proceso.
  • USER: Usuario propietario.
  • PR: Prioridad del proceso.
  • NI: Prioridad asignada (Entre más bajo sea este valor tiene más prioridad).
  • VIRT: Memoria virtual utilizada por el proceso.
  • RES: Memoria RAM física utilizada por el proceso.
  • SHR: Memoria compartida por el proceso.
  • S: Estado del proceso (R, S, T, Z).
  • %CPU Porcentaje de CPU utilizado por el proceso.
  • `%MEMv Porcentaje de memoria física utilizada por el proceso.
  • TIME+ Tiempo de utilización de CPU del proceso.
  • COMMAND Comando con el cual se inicia el proceso.

Además, utilizando las siguientes opciones podemos obtener más funcionalidades:

  • M: Ordenamiento por uso de memoria.
  • P: Ordenamiento por uso de CPU.
  • T: Ordenamiento por tiempo de CPU utilizado.
  • F: Filtro con el cual podemos seleccionar el ordenamiento para la lista de procesos.
  • i: Muestra u oculta los procesos zombie.
  • s: Cambia el tiempo de actualización de la interfaz.
  • z: Cambia los colores.
  • K: Se utiliza para matar procesos solicitando su PID.
  • r: Cambia el nice value solicitando el PID del proceso.
  • q: Se utiliza para salir de la interfaz.
  • h: Muestra la ayuda.

Por otra parte, también tenemos el comando ps, este nos permite visualizar información sobre los procesos de una forma más específica, por ejemplo, si deseamos buscar el proceso SSH lo podemos realizar de la siguiente manera utilizando un pipe con la opción grep y el nombre del proceso:

[[email protected] ~]# ps -aux | grep ssh
root      1019  0.0  0.4 112812  4288         Ss   10:57   0:00 /usr/sbin/sshd -D
root      1270  0.0  0.6 159156  6332         Ss   10:57   0:05 sshd: [email protected]/0
root      1598  0.0  0.6 159156  6312         Ss   13:36   0:00 sshd: [email protected]/1
root      1602  0.0  0.5 158808  5768         Ss   13:36   0:00 sshd: [email protected]
root      1606  0.0  0.2  72180  2820          Ss   13:36   0:00 /usr/libexec/openssh/sftp-server

Algunas de las opciones más relevantes del comando ps son las siguientes:

  • -a En tiempo real, lista los procesos de todos los usuarios.
  • -u Lista información del usuario, Memoria y CPU.
  • -x Lista los procesos para las terminarles y su usuario.
  • -l Muestra información del UID y el valor nice.
  • -f Muestra los parámetros con los que inicio el proceso.
  • -e Muestra la información sobre todos los procesos del sistema.
  • -j Muestra información sobre el PGID y SID

Finalmente, en caso de que se desee finalizar algún proceso utilizamos el comando kill seguido del PID, este manda una señal al sistema para finalizar el proceso, por ejemplo:

[[email protected] ~]# kill 159156

En caso de que el proceso no se detenga podemos añadir la opción -9 (SIGKILL) al comando, esta opción obliga al sistema operativo a finalizar el proceso, ejemplo:

[[email protected] ~]# kill - 9 159156

Nota: Tome en cuenta que estas opciones puede traer repercusiones como recursos suspendidos o inconsistencias después de forzar la finalización de un proceso.

Autor del Artículo

Álvaro Campos Castro

Álvaro Campos Castro

System Administrator.

  • Ingeniero en Sistemas de Información. UNA.
  • Red Hat Certified System Administrator (RHCSA®)
  • Red Hat Certified Engineer (RHCE®)