Taskset
| 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