LFCS: Monitorear el uso de recursos de los procesos de Linux y establecer límites de proceso por usuario - Parte 14


Debido a las modificaciones recientes en los objetivos del examen de certificación LFCS que entraron en vigencia a partir del 2 de febrero de 2016, también estamos agregando los artículos necesarios a la serie LFCE.

Todo administrador de sistemas Linux necesita saber cómo verificar la integridad y disponibilidad del hardware, los recursos y los procesos clave. Además, establecer límites de recursos por usuario también debe ser parte de su conjunto de habilidades.

En este artículo, exploraremos algunas formas de asegurarnos de que el sistema, tanto el hardware como el software, se comporten correctamente para evitar problemas potenciales que puedan causar tiempos de inactividad inesperados en la producción y pérdidas de dinero.

Estadísticas de los procesadores de informes de Linux

Con mpstat puede ver las actividades de cada procesador individualmente o del sistema como un todo, tanto como una instantánea única o dinámicamente.

Para utilizar esta herramienta, deberá instalar sysstat:

# yum update && yum install sysstat              [On CentOS based systems]
# aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
# zypper update && zypper install sysstat        [On openSUSE systems]

Obtenga más información sobre sysstat y sus utilidades en Aprenda Sysstat y sus utilidades mpstat, pidstat, iostat y sar en Linux

Una vez que haya instalado mpstat, utilícelo para generar informes de estadísticas de procesadores.

Para mostrar 3 informes globales de utilización de CPU ( -u ) para todas las CPU (como lo indica -P ALL) en un intervalo de 2 segundos, haga lo siguiente:

# mpstat -P ALL -u 2 3
Linux 3.19.0-32-generic (tecmint.com) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Para ver las mismas estadísticas para una CPU específica (CPU 0 en el siguiente ejemplo), use:

# mpstat -P 0 -u 2 3
Linux 3.19.0-32-generic (tecmint.com) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

La salida de los comandos anteriores muestra estas columnas:

  1. CPU : número de procesador como un entero, o la palabra todos como un promedio para todos los procesadores.
  2. % usr : porcentaje de utilización de la CPU mientras se ejecutan aplicaciones de nivel de usuario.
  3. % nice : igual que % usr , pero con buena prioridad.
  4. % sys : porcentaje de utilización de CPU que se produjo al ejecutar aplicaciones del kernel. Esto no incluye el tiempo dedicado a lidiar con interrupciones o manejar hardware.
  5. % iowait : Porcentaje de tiempo durante el cual la CPU dada (o toda) estuvo inactiva, durante el cual hubo una operación de E/S con uso intensivo de recursos programada en esa CPU. Puede encontrar una explicación más detallada (con ejemplos) aquí.
  6. % irq : porcentaje de tiempo dedicado al mantenimiento de interrupciones de hardware.
  7. % soft : igual que % irq , pero con interrupciones de software.
  8. % robar : Porcentaje de tiempo dedicado a la espera involuntaria (tiempo de robo o robado) cuando una máquina virtual, como invitada, está "ganando" la atención del hipervisor mientras compite por las CPU. Este valor debe mantenerse lo más pequeño posible. Un valor alto en este campo significa que la máquina virtual se está estancando, o pronto lo estará.
  9. % guest : porcentaje de tiempo dedicado a ejecutar un procesador virtual.
  10. % idle : porcentaje de tiempo en el que las CPU no estaban ejecutando ninguna tarea. Si observa un valor bajo en esta columna, eso es una indicación de que el sistema se está colocando bajo una carga pesada. En ese caso, deberá examinar más de cerca la lista de procesos, como veremos en un minuto, para determinar qué lo está causando.

Para colocar el procesador bajo una carga algo alta, ejecute los siguientes comandos y luego ejecute mpstat (como se indica) en una terminal separada:

# dd if=/dev/zero of=test.iso bs=1G count=1
# mpstat -u -P 0 2 3
# ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
# mpstat -u -P 0 2 3

Por último, compárelo con la salida de mpstat en circunstancias "normales":

Como puede ver en la imagen de arriba, la CPU 0 estuvo bajo una gran carga durante los primeros dos ejemplos, como lo indica la columna % idle .

En la siguiente sección, analizaremos cómo identificar estos procesos que consumen muchos recursos, cómo obtener más información sobre ellos y cómo tomar las medidas adecuadas.

Informes de procesos de Linux

Para enumerar los procesos ordenándolos por uso de CPU, usaremos el conocido comando ps con -eo (para seleccionar todos los procesos con formato definido por el usuario) y --sort (para especificar un orden de clasificación personalizado) opciones, así:

# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

El comando anterior solo mostrará el PID , PPID , el comando asociado con el proceso y el porcentaje de uso de CPU y RAM ordenados por el porcentaje de uso de CPU en orden descendente . Cuando se ejecuta durante la creación del archivo .iso, aquí están las primeras líneas del resultado:

Una vez que hayamos identificado un proceso de interés (como el que tiene PID u003d 2822 ), podemos navegar hasta /proc/PID (/proc/2822 en este caso) y haga una lista de directorios.

Este directorio es donde se guardan varios archivos y subdirectorios con información detallada sobre este proceso en particular mientras se ejecuta.

  1. /proc/2822/io contiene estadísticas de IO para el proceso (número de caracteres y bytes leídos y escritos, entre otros, durante las operaciones de IO).
  2. /proc/2822/attr/current muestra los atributos de seguridad actuales de SELinux del proceso.
  3. /proc/2822/cgroup describe los grupos de control (cgroups para abreviar) a los que pertenece el proceso si la opción de configuración del kernel CONFIG_CGROUPS está habilitada, que puede verificar con:

# cat /boot/config-$(uname -r) | grep -i cgroups

Si la opción está habilitada, debería ver:

CONFIG_CGROUPS=y

Con cgroups puede administrar la cantidad de uso de recursos permitido por proceso, como se explica en los Capítulos 1 a 4 de la sección Grupos de control de la documentación del servidor Ubuntu 14.04.

El /proc/2822/fd es un directorio que contiene un enlace simbólico para cada descriptor de archivo que ha abierto el proceso. La siguiente imagen muestra esta información para el proceso que se inició en tty1 (la primera terminal) para crear la imagen .iso:

La imagen de arriba muestra que stdin (descriptor de archivo 0), stdout (descriptor de archivo 1) y stderr (descriptor de archivo 2) están asignados a/dev/zero, /root/test.iso y/dev/tty1, respectivamente.

Puede encontrar más información sobre /proc en el documento "El sistema de archivos /proc " mantenido y mantenido por Kernel.org, y en el Manual del programador de Linux.

Establecer límites de recursos por usuario en Linux

Si no tiene cuidado y permite que cualquier usuario ejecute un número ilimitado de procesos, eventualmente puede experimentar un cierre inesperado del sistema o quedar bloqueado cuando el sistema entra en un estado inutilizable. Para evitar que esto suceda, debe establecer un límite en la cantidad de procesos que los usuarios pueden iniciar.

Para hacer esto, edite /etc/security/limits.conf y agregue la siguiente línea al final del archivo para establecer el límite:

*   	hard	nproc   10

El primer campo se puede usar para indicar un usuario, un grupo o todos ellos (*) , mientras que el segundo campo impone un límite estricto en el número de procesos (nproc) a 10. Para aplicar cambios, cerrar la sesión y volver a entrar es suficiente.

Por lo tanto, veamos qué sucede si un determinado usuario que no sea root (ya sea legítimo o no) intenta iniciar una bomba de shell fork. Si no hubiéramos implementado límites, esto inicialmente lanzaría dos instancias de una función y luego duplicaría cada una de ellas en un ciclo interminable. Por lo tanto, eventualmente haría que su sistema se ralentizara.

Sin embargo, con la restricción anterior en su lugar, la bomba de bifurcación no tiene éxito, pero el usuario seguirá bloqueado hasta que el administrador del sistema finalice el proceso asociado con él:

SUGERENCIA: Otras posibles restricciones hechas posibles por ulimit están documentadas en el archivo limits.conf .

Otras herramientas de gestión de procesos de Linux

Además de las herramientas discutidas anteriormente, un administrador del sistema también puede necesitar:

a) Modificar la prioridad de ejecución (uso de recursos del sistema) de un proceso usando renice. Esto significa que el kernel asignará más o menos recursos del sistema al proceso en función de la prioridad asignada (un número comúnmente conocido como "bondad" en un rango de -20 a 19 ).

Cuanto menor sea el valor, mayor será la prioridad de ejecución. Los usuarios regulares (que no sean root) solo pueden modificar la bondad de los procesos que poseen a un valor más alto (lo que significa una prioridad de ejecución más baja), mientras que root puede modificar este valor para cualquier proceso y puede aumentarlo o disminuirlo.

La sintaxis básica de renice es la siguiente:

# renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Si el argumento después del nuevo valor de prioridad no está presente (vacío), se establece en PID por defecto. En ese caso, la bondad del proceso con PID u003d identifier se establece en .

b) Interrumpir la ejecución normal de un proceso cuando sea necesario. Esto se conoce comúnmente como "matar" el proceso. Bajo el capó, esto significa enviar al proceso una señal para finalizar su ejecución correctamente y liberar los recursos utilizados de manera ordenada.

Para matar un proceso, use el comando kill de la siguiente manera:

# kill PID

Alternativamente, puede usar pkill para terminar todos los procesos de un propietario determinado (-u) , o un propietario de grupo (-G) , o incluso aquellos procesos que tienen un PPID en común (-P) . Estas opciones pueden ir seguidas de la representación numérica o del nombre real como identificador:

# pkill [options] identifier

Por ejemplo,

# pkill -G 1000

matará todos los procesos propiedad del grupo con GID u003d 1000.

Y,

# pkill -P 4993 

matará todos los procesos cuyo PPID sea 4993.

Antes de ejecutar un pkill, es una buena idea probar los resultados con pgrep primero, quizás usando la opción -l también para listar los nombres de los procesos. Toma las mismas opciones pero solo devuelve los PID de los procesos (sin realizar ninguna acción adicional) que se eliminarían si se usara pkill.

# pgrep -l -u gacanepa

Esto se ilustra en la siguiente imagen:

Resumen

En este artículo, hemos explorado algunas formas de monitorear el uso de recursos para verificar la integridad y disponibilidad de componentes críticos de hardware y software en un sistema Linux.

También hemos aprendido cómo tomar las medidas adecuadas (ya sea ajustando la prioridad de ejecución de un proceso determinado o finalizándolo) en circunstancias inusuales.

Esperamos que los conceptos explicados en este tutorial hayan sido de ayuda. Si tiene alguna pregunta o comentario, no dude en comunicarse con nosotros mediante el formulario de contacto a continuación.