Taskset

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Affinité CPU des processus
Commande taskset
Contexte Systèmes multi-cœurs / NUMA — épingler un processus sur un sous-ensemble de CPU
Voir aussi chrt (priorité d'ordonnancement), nice (priorité de base)

taskset lit ou modifie l'affinité CPU d'un processus, c'est-à-dire l'ensemble des cœurs sur lesquels l'ordonnanceur Linux est autorisé à l'exécuter. Utile pour isoler une charge sur un cœur dédié, éviter la migration entre cœurs (cache CPU froid) ou reproduire un problème lié au NUMA.

Syntaxe

taskset [options] masque commande [arguments]   # lancer une nouvelle commande avec une affinité donnée
taskset [options] -p [masque] PID               # lire ou modifier l'affinité d'un processus existant

Options utiles : -p agit sur un PID existant plutôt que de lancer une commande, -c exprime l'affinité en liste de CPU plutôt qu'en masque hexadécimal, -a applique le changement à tous les threads du processus (pas seulement le thread principal), -v affiche l'ancienne et la nouvelle affinité.

Masque hexadécimal ou liste de CPU

Par défaut taskset attend un masque hexadécimal où chaque bit représente un CPU (bit 0 = CPU0, bit 1 = CPU1, etc.) : 0x1 = CPU0 seul, 0x3 = CPU0+CPU1, 0x5 = CPU0+CPU2. Avec -c, on donne directement une liste ou une plage de numéros de CPU, plus lisible dès qu'il y a plus de deux ou trois cœurs : -c 0,2 ou -c 0-3.

# lister les CPU disponibles
nproc --all
lscpu

# masque hexadécimal correspondant à chaque CPU (pour construire un masque à la main)
for cpu in $(seq 0 $(($(nproc --all) - 1))); do
  printf 'CPU %d : 0x%X\n' "$cpu" $((1 << cpu))
done

Exemples

# lancer une commande en la limitant au CPU 2 (masque hexadécimal)
taskset 0x4 dd if=/dev/zero of=/dev/null

# équivalent avec la syntaxe liste, plus lisible
taskset -c 2 dd if=/dev/zero of=/dev/null

# lire l'affinité actuelle d'un processus déjà lancé
taskset -p 7252

# épingler le processus 7252 sur le CPU 1 uniquement
taskset -p 0x2 7252

# épingler le processus 7252 sur les CPU 0 et 1
taskset -p 0x3 7252

# même chose, avec la syntaxe liste, et sur tous ses threads
taskset -acp 0,1 7252

Priorité d'ordonnancement : chrt

taskset choisit *où* un processus s'exécute (quels cœurs), mais pas avec quelle priorité l'ordonnanceur le sert par rapport aux autres. Pour ça, chrt (du même paquet util-linux) permet de lire ou changer la politique et la priorité d'ordonnancement d'un processus — utile en complément de taskset pour des tâches temps réel isolées sur un cœur dédié.

# lire la politique et la priorité actuelles d'un PID
chrt -p 7252

# passer un PID en temps réel FIFO, priorité 50
chrt -f -p 50 7252

# revenir à l'ordonnancement standard (SCHED_OTHER)
chrt -o -p 0 7252

⚠️ Les politiques temps réel (-f/FIFO, -r/round-robin) peuvent affamer les autres processus si la priorité est mal choisie — à réserver à des tâches courtes et bien maîtrisées, en général combinées à un cœur dédié via taskset.

Voir aussi

  • Ps — pour retrouver le PID d'un processus avant de lui appliquer taskset ou chrt