¿Has oído hablar del término afinidad del procesador? Es una función que le permite vincular o desvincular procesos a una unidad central de procesamiento en particular o a un rango de CPU. Sí, puede decirle al sistema qué núcleo(s) de CPU se deben usar para ejecutar un proceso en particular. Para obtener detalles teóricos sobre por qué existe la afinidad del procesador, diríjase aquí.
Aquí, en este tutorial, hablaremos de una utilidad denominada taskset - que le permite lograr la afinidad del procesador. Pero antes de hacerlo, vale la pena mencionar que todos los ejemplos de este tutorial se probaron en una máquina con Ubuntu 20.04 LTS y en Debian 10.
Comando de conjunto de tareas de Linux
El comando tasket le permite configurar o recuperar la afinidad de CPU de un proceso. La siguiente es su sintaxis:
taskset [options] mask command [argument...]
taskset [options] -p [mask] pid
Así es como la página de manual de la herramienta lo explica:
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.
Los siguientes son algunos ejemplos con estilo de preguntas y respuestas que le darán una mejor idea de cómo funciona el comando taskset.
P1. ¿Cómo usar el conjunto de tareas para recuperar la afinidad de CPU de un proceso?
Si desea que el conjunto de tareas muestre la afinidad de la CPU de un proceso que ya se está ejecutando, use el comando de la siguiente manera:
taskset -p [PID]
Simplemente reemplace PID con la ID del proceso cuya afinidad de CPU desea obtener. Por ejemplo:
taskset -p 9726
El comando anterior devolvió el siguiente resultado:
pid 9726's current affinity mask: f
Entonces, el valor hexadecimal 'f' aquí significa que el proceso puede ejecutarse en cualquiera de los 4 núcleos del procesador:0,1,2,3.
Si desea que la salida sea en términos de rango de CPU, puede agregar la opción de línea de comando -c.
taskset -cp 9726
El siguiente es el resultado en este caso:
pid 9726's current affinity list: 0-3
P2. ¿Cómo cambiar la afinidad de la CPU usando el conjunto de tareas?
Para modificar la afinidad de la CPU de un proceso existente, debe especificar el ID del proceso (como hicimos en la sección anterior) junto con una máscara hexadecimal que define la nueva afinidad.
Por ejemplo, la afinidad de CPU actual del proceso Gedit (PID:9726) es 'f'.
Para cambiar la afinidad a 0x11, use el siguiente comando:
taskset -p 0x11 9726
Y luego puede verificar nuevamente la nueva afinidad usando el siguiente comando:
taskset -p 9726
Las siguientes capturas de pantalla muestran los resultados de estos comandos en mi caso:
Para que pueda ver que la afinidad cambió.
P3. ¿Cómo asignar un rango de CPU al cambiar la afinidad?
Esto no es gran cosa. Todo lo que tiene que hacer es agregar la opción de línea de comando -c al comando que usamos en la sección anterior junto con el rango de núcleo de CPU como entrada.
Este es un ejemplo:
conjunto de tareas -cp 0,3 9726
La siguiente es 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 puede iniciar un proceso con una afinidad de CPU establecida.
Por ejemplo, inicié el editor de texto gedit con afinidad de CPU 0xa.
conjunto de tareas 0xa gedit
Conclusión
De acuerdo, el comando taskset no es para un usuario de línea de comandos promedio. Es utilizado principalmente por expertos del lado del servidor para la optimización de procesos en un entorno de varios núcleos. Hemos discutido los conceptos básicos de la herramienta aquí. Para obtener más información, diríjase a su página de manual.