Tutorial de comandos de Linux para principiantes (con ejemplos)

¿Has oído alguna vez el término afinidad de procesadores? Es una función que te permite vincular o desvincular procesos a una unidad central de proceso concreta, o a un rango de CPUs. Sí, puedes decirle al sistema qué núcleo(s) de la CPU debe(n) utilizarse para ejecutar un proceso concreto. Para conocer los detalles teóricos de por qué existe la afinidad de procesadores, dirígete aquí.

En este tutorial, hablaremos de una utilidad -denominada taskset- que te permite conseguir la afinidad de procesadores. Pero antes de hacerlo, conviene mencionar que todos los ejemplos de este tutorial se han probado en una máquina Ubuntu 20.04 LTS y en Debian 10.

Comando Linux taskset

El comando taskset te permite establecer o recuperar la afinidad de la CPU de un proceso. A continuación se muestra su sintaxis:

taskset [options] mask command [argument...]
taskset [options] -p [mask] pid

Así es como lo explica la página man de la herramienta:

       taskset  is  used  to  set  or  retrieve  the CPU affinity of a running
       process given its pid, or to launch a new  command  with  a  given  CPU
       affinity.   CPU affinity is a scheduler property that "bonds" a process
       to a given set of CPUs on the system.  The Linux scheduler  will  honor
       the  given CPU affinity and the process will not run on any other CPUs.
       Note that the Linux scheduler also supports natural CPU  affinity:  the
       scheduler attempts to keep processes on the same CPU as long as practi?
       cal for performance reasons.  Therefore, forcing a specific CPU  affin?
       ity is useful only in certain applications.

       The CPU affinity is represented as a bitmask, with the lowest order bit
       corresponding to the first logical CPU and the highest order bit corre?
       sponding  to  the  last logical CPU.  Not all CPUs may exist on a given
       system but a mask may specify more CPUs than are present.  A  retrieved
       mask  will  reflect only the bits that correspond to CPUs physically on
       the system.  If an invalid mask is given (i.e., one that corresponds to
       no  valid  CPUs on the current system) an error is returned.  The masks
       may be specified in hexadecimal (with or without a leading "0x"), or as
       a CPU list with the --cpu-list option.  For example,

           0x00000001  is processor #0,

           0x00000003  is processors #0 and #1,

           0xFFFFFFFF  is processors #0 through #31,

           32          is processors #1, #4, and #5,

           --cpu-list 0-2,6
                       is processors #0, #1, #2, and #6.

       When  taskset returns, it is guaranteed that the given program has been
       scheduled to a legal CPU.

A continuación se presentan algunos ejemplos al estilo de las preguntas y respuestas que deberían darte una mejor idea de cómo funciona el comando taskset.

Q1. ¿Cómo utilizar taskset para obtener la afinidad de la CPU de un proceso?

Si quieres que taskset muestre la afinidad de la CPU de un proceso que ya se está ejecutando, utiliza el comando de la siguiente manera:

taskset -p [PID]

Sólo tienes que sustituir PID por el ID del proceso cuya afinidad de CPU quieres obtener. Por ejemplo:

taskset -p 9726

El comando anterior devuelve la siguiente salida:

pid 9726's current affinity mask: f

El valor hexadecimal «f» significa aquí que el proceso puede ejecutarse en cualquiera de los 4 núcleos del procesador: 0,1,2,3.

Si quieres que la salida sea en términos de rango de CPU, puedes añadir la opción de línea de comandos -c.

taskset -cp 9726

A continuación se muestra la salida en este caso:

pid 9726's current affinity list: 0-3

Q2. ¿Cómo cambiar la afinidad de la CPU mediante el conjunto de tareas?

Para modificar la afinidad de la CPU de un proceso existente, tienes que especificar el ID del proceso (como hicimos en la sección anterior) junto con una máscara hexadecimal que defina la nueva afinidad.

Por ejemplo, la afinidad actual de la CPU del proceso Gedit (PID: 9726) es «f».

Cómo cambiar la afinidad de la CPU utilizando la hoja de ruta

Para cambiar la afinidad a 0x11, utiliza el siguiente comando:

taskset -p 0x11 9726

Y luego puedes volver a comprobar la nueva afinidad utilizando el siguiente comando:

taskset -p 9726

Las siguientes capturas de pantalla muestran las salidas de estos comandos en mi caso:

Utilizar las tareas

Así puedes ver que la afinidad se ha cambiado.

Q3. ¿Cómo asignar un rango de CPUs al cambiar la afinidad?

Esto no es un gran problema. Todo lo que tienes que hacer es añadir la opción de línea de comandos -c al comando que hemos utilizado en la sección anterior junto con el rango de núcleos de CPU como entrada.

Aquí tienes un ejemplo:

taskset -cp 0,3 9726

A continuación se muestra la salida producida en este caso:

pid 9726's current affinity list: 0
pid 9726's new affinity list: 0,3

Q4. ¿Cómo lanzar un proceso con afinidad de CPU predefinida?

Sí, también puedes lanzar un proceso con una afinidad de CPU establecida.

Por ejemplo, he lanzado el editor de texto gedit con afinidad de CPU 0xa.

taskset 0xa gedit

Conclusión

De acuerdo, el comando taskset no es para un usuario medio de la línea de comandos. Lo utilizan sobre todo los expertos del lado del servidor para la optimización de procesos en un entorno multinúcleo. Aquí hemos hablado de los fundamentos de la herramienta. Para obtener más información, dirígete a su página man.

También te podría gustar...