
¿Cómo puedo configurar la afinidad del procesador de un proceso en Linux?
Respuesta1
He usado el conjunto de tareas para esto. Si tiene instalado el conjunto de tareas, algo como:
taskset -cp 0,2 45678
configuraría el proceso con id 45678 para que tenga afinidad con los cpus 1 y 3.
Respuesta2
Dentro del proceso, la llamada sería sched_setaffinity()
, o para cosas de pthreads,pthread_setaffinity_np()
En una nota relacionada, si le preocupa la afinidad de la CPU de su programa, puede que valga la pena prestar atención a cómo realiza también la asignación de memoria. Los sistemas más grandes con memoria conectada a más de un controlador (es decir, múltiples zócalos de CPU, cada uno con el suyo) tendrán latencia y ancho de banda variables entre diferentes pares de CPU y memoria. También querrás investigar la afinidad NUMA, usando el numactl
comando o las llamadas al sistema con las que funciona. Un programa en el que trabajé obtuvo una mejora de rendimiento del 10% gracias a esto.
Respuesta3
Necesita instalar schedutils
(utilidades del programador de Linux). Lo he usado en mi escritorio Ubuntu.
SFenlace
Respuesta4
taskset -c 1-3 ./a.out arg1 arg2
lanza el a.out
proceso con argumentos dados y afinidad configurada para los procesadores 1, 2 o 3 (base cero).
Aquí hay un programa de prueba C mínimo que puede usarse para verlo en acción:https://stackoverflow.com/questions/10490756/how-to-use-sched-getaffinity-and-sched-setaffinity-in-linux-from-c/50117787#50117787