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».
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:
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.