2 votes

GNU parallel n'utilise pas pleinement mes processeurs

J'exécute une commande comme celle-ci sur mon serveur de 36 cœurs (EC2 c4.8xlarge/Amazon Linux).

find . -type f | parallel -j 36 mycommand

Le nombre de fichiers à traiter est de ~1.000.000, et cela prend des dizaines de minutes. Il devrait exécuter 36 processus simultanément. Cependant, d'après le résultat de top il y a environ 10 processus au maximum, et 70% sont inactifs. ps montre plus de processus, mais la plupart d'entre eux sont défunts.

J'ai deviné que c'était parce que chaque mycommand a terminé si rapidement, parallel n'a pas pu rattraper son retard en créant de nouveaux processus. J'ai donc essayé parallel --nice 20 pour allouer plus de temps CPU à parallel mais cela n'a pas fonctionné.

Quelqu'un a-t-il une idée pour améliorer cela ?

$ parallel --version GNU parallel 20151022

3voto

Sakkle Points 998

Le nombre de fichiers à traiter est de ~1.000.000, et cela prend des dizaines de minutes.

Vous exécutez donc environ 600 tâches par seconde. L'overhead d'un seul travail GNU Parallel est de l'ordre de 2 à 5 ms, donc si vous obtenez plus de 200 travaux par seconde, GNU Parallel ne sera pas plus performant sans ajustement.

L'astuce consiste à avoir plus parallel en parallèle. À partir de https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Running-more-than-250-jobs-workaround

cat myinput | parallel --pipe -N 100 --round-robin -j50 parallel -j100 your_prg

De cette façon, vous aurez 50 GNU Parallel qui pourront chacun générer 100 tâches par seconde.

0voto

Hristo Mohamed Points 1

Eh, si j'ai bien compris vos questions, vous voulez traiter tous les fichiers simultanément ?
parallel lancera plusieurs instances de mycommand et non multiple find instances.

0voto

Jake Points 113

Vous essayez d'ouvrir un million de fichiers, 36 à la fois. Même si votre commande pouvait fonctionner à pleine puissance sur un seul processeur, vous auriez encore à supporter les frais généraux liés à l'ouverture de ces fichiers. Les E/S sont l'une des opérations les plus coûteuses en temps sur les ordinateurs. Le mieux serait de charger au préalable un maximum de ces fichiers dans la RAM de votre machine et de travailler en RAM autant que possible. Selon la quantité de RAM dont vous disposez, cela peut améliorer les performances de manière significative, car une fois qu'une lecture est lancée, les lectures suivantes ont tendance à s'appuyer sur la mise en cache si elles sont effectuées immédiatement l'une après l'autre. Vous pouvez également vous assurer que votre système de fichiers dépose les fichiers d'une manière efficace pour le cache et qu'il est un bon fs lorsqu'il s'agit de lectures ultérieures multiples.

Je ne pense pas que parallel va beaucoup vous aider dans cette refactorisation.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X