11
votes

Comment exécuter des processus de canalisations avec BASH sur plusieurs cœurs?

J'ai un simple script bash que la sortie de tuyaux d'un processus à l'autre. A savoir:.

dostuff | taskset -c 0 filterstuff 


8 commentaires

Essayez de répéter votre test avec top plusieurs fois (sans TaskSet ). 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) 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 . Dans l'affaire originale, dostuff effectue des calculs coûteux et génère des lots de sortie et filtreStuff 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?


3 Réponses :


7
votes

Essayez d'essayer de définir l'affinité CPU (processeur):

top -p 1234, 1255, 1211, 1212, 1270, 1275, 1261, 1250, 16521, 16522


3 commentaires

Incroyable! Ça marche. Mais, hm, pourquoi ne puis-je pas échapper à l'attribution manuelle aux cœurs?


Voir Man Source_setschéduleur et Man CPUSET Pour plus d'informations. Linux fait un bon travail de planification. Essayez d'exécuter haut et appuyez sur FJ pour ajouter le champ processeur (P) et vous verrez que différents processus sont en cours d'exécution sur différents processeurs.


Vous pouvez également appuyer sur 1 (un) dans top pour voir la charge de la CPU séparément par cpu en haut.



7
votes

Supposons Dostuff 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 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.

Si votre noyau est construit avec config_sched_debug = y , xxx

devrait désactiver cette classe d'heuristique. (Voir /usr/src/linux/kernel/sched_features.h et / proc / sys / kernel / plancher _ * pour d'autres tunables de planificateur.)

Si cela aide et que le problème se produit toujours avec un nouveau noyau, et 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.


3 commentaires

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.



1
votes

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.

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é).

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.


2 commentaires

Votre hypothèse est fausse. Les processus fonctionnent comme ceci: dostuff prend 60% du temps de la CPU de Core et filtreStuff 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.