différence entre l'ensemble de tâches et l'ensemble de tâches

8

J'essaie de réduire la latence de mon application réseau Linux. J'ai appris qu'il existe deux outils pour «lier» un programme à un cœur de processeur particulier: le jeu de tâches et le cpuset.

  1. Laquelle devrais-je préférer? Sont-ils équivalents à un niveau inférieur?
  2. (la disposition) Mon application a un seul thread et est censée traiter une seule connexion TCP (pas de reconnexion) sur un réseau LAN rapide avec le moins de latence possible. Suis-je sur la bonne voie?
John Linberg
la source
Avez-vous lu leurs pages de manuel respectives?
Michael Hampton
Avez-vous exécuté un profilage détaillé afin d'être sûr que c'est la partie réseau Linux qui cause la latence, et non l'application?
Tero Kilkanen du
Quel système d'exploitation / distribution / version / noyau utilisez-vous?
ewwhite
De plus, quel type de matériel est impliqué?
Marque

Réponses:

12

L'ensemble de tâches sert à lier un processus à un ou plusieurs processeurs; spécifiant essentiellement il peut s'exécuter lors de l'exécution initiale ou pendant son exécution. Si vous utilisez RHEL / CentOS sur un équipement de serveur moderne, il numactlest recommandé de le faire taskset.

Cpuset / cset est pour le blindage CPU et est un framework construit autour des cgroups Linux. Cset n'a jamais été populaire sur certaines distributions (comme RHEL) car il existe d'autres outils disponibles pour la gestion des processus.

La première commande ci-dessous crée un bouclier qui limiterait les tâches du système d'exploitation aux cœurs CPU 0 et 8. La seconde déplacerait votre session shell actuelle vers le bouclier CPU spécifié, résultant en une isolation des processus système et utilisateur.

# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user

Il y a d'autres choses à vérifier et à régler avant de suivre le chemin des processus de liaison aux CPU; interruptions ( irqbalancedésactivation partielle), paramètres d'économie d'énergie, planificateur système, ascenseurs d'E / S, politique en temps réel ( chrt).

Voir: Paramètres TCP à faible latence sur Ubuntu

Voici un exemple ( compliqué ) d'un wrapper d'application qui sélectionne un noyau, arrête l'irqbalance, le démarre et met en liste noire le noyau sélectionné, puis exécute ./your_program avec SCHED_FIFO et la priorité 99 sur le noyau sélectionné.

Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program
ewwhite
la source
1
Notez qu'il est possible pour une application de réinitialiser ses affinités lors de l'utilisation taskset. Si vous utilisez cpuset, il n'est pas possible de modifier vos affinités par rapport à ce que le cpuset vous accorde.
Matthew Ife
Et numactl??
ewwhite
1
De même, les deux programmes appellent le même appel système sous-jacent sched_setaffinity.
Matthew Ife