J'ai un simple script bash que la sortie de tuyaux d'un processus à l'autre. A savoir:.
dostuff | taskset -c 0 filterstuff
3 Réponses :
Essayez d'essayer de définir l'affinité CPU (processeur):
top -p 1234, 1255, 1211, 1212, 1270, 1275, 1261, 1250, 16521, 16522
Incroyable! Ça marche. Mais, hm, pourquoi ne puis-je pas échapper à l'attribution manuelle aux cœurs?
Voir Man Source_setschéduleur Code> et
Man CPUSET CODE> Pour plus d'informations. Linux fait un bon travail de planification. Essayez d'exécuter
haut code> et appuyez sur FJ
Vous pouvez également appuyer sur 1 code> (un) dans
top code> pour voir la charge de la CPU séparément par cpu en haut.
Supposons Si votre noyau est construit avec devrait désactiver cette classe d'heuristique. (Voir Si cela aide et que le problème se produit toujours avec un nouveau noyau, et strong> Il est vraiment plus rapide de courir sur des processeurs séparés que d'un processeur, veuillez signaler le problème à la liste de diffusion de Kernel Linux afin qu'elles puissent ajuster leurs heuristiques. P> p> Dostuff code> est en cours d'exécution sur un processeur. Il écrit des données dans un tuyau et que les données seront en cache sur cette CPU. Parce que
filtreur code> lit à partir de ce tuyau, le planificateur décide de l'exécuter sur le même processeur, de sorte que ses données d'entrée sont déjà dans le cache.
config_sched_debug = y code>, p>
/usr/src/linux/kernel/sched_features.h code> et
/ proc / sys / kernel / plancher _ * code> pour d'autres tunables de planificateur.) P>
No_sync_wakeups a fonctionné. Cependant, le noyau est de 2,6,27, alors que sur 2,6,30 Système, le problème ne semble pas surgir. Je vais enquêter plus loin.
Ne pouvait pas le reproduire sur 2,6h30. Les processus rebondissent entre les noyaux avec et sans synchronisation.
Ok, je pense que cela résout le problème. Étant donné que mon produit n'a pas beaucoup d'utilisateurs et que leurs noyaux sont bien compilés, je peux leur demander de les accorder de la manière dont vous avez fourni. Merci.
Le planificateur Linux est conçu pour donner un maximum de débit, ne pas faire ce que vous imaginez est le meilleur. Si vous exécutez des processus connectés à un tuyau, sous vraisemblance, l'un d'entre eux bloque l'autre, puis ils échangent. Les exécuter sur des cœurs séparés obtiendrait peu ou rien, donc ça ne le fait pas. P>
Si vous avez deux tâches qui sont véritablement prêtes à courir sur la CPU, je m'attendrais à les voir planifiées sur différents cœurs (à un moment donné). P>
Je suppose que ce qui se passe est que Dostuff passe jusqu'à ce que le tampon de tuyau devienne plein, à quel point il ne puisse plus s'exécuter, le processus "filtreStuff" fonctionne, mais il fonctionne pendant une période aussi courte que Dostuff ne 't être reporté jusqu'à ce que FiltrirStuff a fini de filtrer tout le tampon de tuyau, à quel point Dostuff devient alors programmé à nouveau. P>
Votre hypothèse est fausse. Les processus fonctionnent comme ceci: dostuff code> prend 60% du temps de la CPU de Core et
filtreStuff code> prend les 40% restants. Et ils ne sont pas reportés à différents noyaux avec plusieurs minutes de course.
Assez juste alors, juste une idée.
Essayez de répéter votre test avec
top code> plusieurs fois (sans
TaskSet code>). Quand j'ai fait, parfois, les deux processus étaient sur le même processeur, parfois différents.
Ils sont toujours sur le même et utilisent seulement 50% du système :(
Essayez
(dostuff) | (filtre) code> et voir quel noyau ils apparaissent sur. Une différence (si elle importe) est que vous êtes sur un système multicœur et que je suis sur un système multi-processeur (un seul noyau chacun). Pourquoi voulez-vous quand même séparer ces processus? Sont-ils des programmes que vous avez écrites et pouvez-vous les changer pour qu'ils influencent eux-mêmes le planificateur?
S'ils sont en série (la nature des tuyaux Unix) obtenez-vous vraiment une performance boost s'ils sont à différents cœurs?
@Jeremy: Oui, il fonctionne 2 à 3 fois plus vite sur différents cœurs: j'ai mesuré cela sur
bzcat file.bz2 | gzip> fichier.gz code>. Dans l'affaire originale,
dostuff code> effectue des calculs coûteux et génère des lots de sortie et
filtreStuff code> l'archive sur la volée. Le transfert de données n'est pas un goulot d'étranglement dans mon cas.
@PAVEL a été expliqué: voir mon poste édité pour une expérience que vous pourriez essayer.
Si ce processus est vraiment plus rapide lorsque vous le forcez à deux cœurs séparés, vous devez envoyer une édition de cette affaire à LKML. Les heuristiques cassées doivent être réparées.
@Novelocrat est l'endroit idéal pour ce lkml ou devriez-vous frapper pour pouvoir exécuter l'heuristique sans aide de noyau?