LFCS: Supervise los procesos de Linux en el uso de recursos y establezca límites de procesos por usuario - Parte 14


Debido a las modificaciones recientes en los objetivos del examen de certificación de LFCS a partir del 2 de febrero de 2016 , estamos agregando los artículos necesarios a la serie de LFCS publicada aquí. Para prepararse para este examen, se le recomienda encarecidamente que también pase por la serie LFCE.

Todos los administradores de sistemas Linux deben saber cómo verificar la integridad y disponibilidad de hardware, recursos y procesos clave. Además, el establecimiento de límites de recursos por usuario también debe ser parte de su conjunto de habilidades.

En este artículo, exploraremos algunas formas de garantizar que el sistema y el hardware del sistema se comporten correctamente para evitar posibles problemas que pueden causar un tiempo de inactividad inesperado en la producción y una pérdida de dinero.

Estadísticas de los procesadores de informes de Linux

Con mpstat puede ver las actividades para cada procesador individualmente o para el sistema en su totalidad, como una instantánea de una sola vez 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]

Lea más sobre sysstat y sus utilidades en Learn Sysstat and Its Utilities 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 la utilización de la CPU ( -u ) para todas las CPU (según lo indicado por -P ALL) en un intervalo de 2 segundos hacer

# 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: Processor number as an integer, or the word all as an average for all processors.
  2. %usr: Percentage of CPU utilization while running user level applications.
  3. %nice: Same as %usr, but with nice priority.
  4. %sys: Percentage of CPU utilization that occurred while executing kernel applications. This does not include time spent dealing with interrupts or handling hardware.
  5. %iowait: Percentage of time when the given CPU (or all) was idle, during which there was a resource-intensive I/O operation scheduled on that CPU. A more detailed explanation (with examples) can be found here.
  6. %irq: Percentage of time spent servicing hardware interrupts.
  7. %soft: Same as %irq, but with software interrupts.
  8. %steal: Percentage of time spent in involuntary wait (steal or stolen time) when a virtual machine, as guest, is “winning” the hypervisor’s attention while competing for the CPU(s). This value should be kept as small as possible. A high value in this field means the virtual machine is stalling – or soon will be.
  9. %guest: Percentage of time spent running a virtual processor.
  10. %idle: percentage of time when CPU(s) were not executing any tasks. If you observe a low value in this column, that is an indication of the system being placed under a heavy load. In that case, you will need to take a closer look at the process list, as we will discuss in a minute, to determine what is causing it.

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

# 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

Finalmente, compare con la salida de mpstat en circunstancias "normales":

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

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

Informes de Procesos Linux

Para enumerar los procesos ordenándolos por el uso de la 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, como las siguientes:

# 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 , estas son las primeras líneas de la salida:

Una vez que hemos identificado un proceso de interés (como el que tiene PID = 2822 ), podemos navegar a /proc/PID (/proc/2822 en este caso) y hacer un listado 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 contains IO statistics for the process (number of characters and bytes read and written, among others, during IO operations).
  2. /proc/2822/attr/current shows the current SELinux security attributes of the process.
  3. /proc/2822/cgroup describes the control groups (cgroups for short) to which the process belongs if the CONFIG_CGROUPS kernel configuration option is enabled, which you can verify with:
# cat /boot/config-$(uname -r) | grep -i cgroups

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

CONFIG_CGROUPS=y

Al utilizar cgroups , puede administrar la cantidad de uso de recursos permitido por proceso, tal como se explica en los Capítulos 1 a 4 de la Guía de administración de recursos de Red Hat Enterprise Linux 7, en el Capítulo 9 de OpenSUSE System Analysis. y la Guía de ajuste, y en 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 el proceso ha abierto. La siguiente imagen muestra esta información para el proceso que se inició en tty1 (el primer 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 ) se asignan 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 ” guardado por Kernel.org, y en el Manual del Programador de Linux.

Configuración de límites de recursos por usuario en Linux

Si no es cuidadoso y permite que cualquier usuario ejecute un número ilimitado de procesos, es posible que finalmente experimente un cierre inesperado del sistema o se bloquee 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 hacerlo, edite /etc/security/limits.conf y agregue la siguiente línea en la parte inferior del archivo para establecer el límite:

*   	hard	nproc   10

El primer campo puede usarse 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) para 10 . Para aplicar los cambios, cerrar y volver a iniciar sesión es suficiente.

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

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

rojo

Otras herramientas de gestión de procesos de Linux

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

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

Cuanto menor sea el valor, mayor será la prioridad de ejecución. Los usuarios regulares (aparte de la raíz) solo pueden modificar la amabilidad de los procesos que poseen a un valor más alto (lo que significa una menor prioridad de ejecución), mientras que la raíz puede modificar este valor para cualquier proceso, y puede aumentar 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 de forma predeterminada. En ese caso, la facilidad del proceso con PID = identifier se establece en & lt; new prioridad & gt; .

b) Interrumpe 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 finalizar 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 el nombre real como identificador:

# pkill [options] identifier

Por ejemplo,

# pkill -G 1000

eliminará todos los procesos que pertenezcan al grupo con GID = 1000 .

Y,

# pkill -P 4993 

eliminará todos los procesos cuyo PPID sea 4993 .

Antes de ejecutar un pkill , es una buena idea probar los resultados con pgrep primero, quizás utilizando la opción -l , así como una lista Procesos de nombres. Toma las mismas opciones, pero solo devuelve los PID de los procesos (sin realizar ninguna acción adicional) que se eliminarán si se utiliza 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 los componentes críticos de hardware y software en un sistema Linux.

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

Esperamos que los conceptos explicados en este tutorial hayan sido útiles. Si tiene alguna pregunta o comentario, no dude en comunicarse con nosotros a través del formulario de contacto a continuación.