Je peux ssh dans une machine distante qui a 64 cœurs. Disons que je dois exécuter 640 scripts shell en parallèle sur cette machine. Comment puis-je faire cela?
Je peux voir la division des 640 scripts en 64 groupes chacun de 10 scripts. Comment pourrais-je alors exécuter chacun de ces groupes en parallèle , c'est-à-dire un groupe sur chacun des cœurs disponibles?
Serait un script de la forme
./script_A &
./script_B &
./script_C &
...
où script_A
correspond au premier groupe, script_B
au deuxième groupe etc., suffit?
Les scripts au sein d'un groupe qui s'exécutent sur un cœur sont autorisés à s'exécuter séquentiellement, mais je veux que les groupes s'exécutent en parallèle sur tous les cœurs.
parallelism
À M
la source
la source
Réponses:
Cela ressemble à un travail pour GNU Parallel:
L'avantage est que vous n'avez pas à regrouper vos scripts par cœurs, cela
parallel
se fera pour vous.Bien sûr, si vous ne voulez pas garder la session SSH pendant l'exécution des scripts, vous devez utiliser
nohup
ouscreen
la source
parallel
package. Merci`bash -c
peut être inutile:parallel ::: ./script*
. Avec 640 scripts, il est probable qu'ils soient très similaires (par exemple, seul un argument est différent). Pour cela, envisagez d'utiliser GNU Parallel directement pour définir ces arguments et utilisez un seul script.Cela fonctionnera tant que vous n'aurez pas besoin de surveiller la sortie et que vous serez d'accord pour laisser votre session ssh ouverte aussi longtemps que les scripts prendront pour s'exécuter. Si l'un ou l'autre n'est pas vrai, je recommanderais de l'utiliser
screen
avec plusieurs onglets. Vous pourriez faire quelque chose commela source
nohup
fonctionnerait probablement, je suis juste plus familierscreen
et il a beaucoup plus de fonctionnalités qui peuvent ou non vous être utiles.Pour lancer et gérer un grand nombre de travaux de script, vous aurez besoin d'une sorte de logiciel de gestion pour contrôler l'utilisation des ressources (CPU, mémoire, priorité), voir l'état du travail (attendre, suspendre, exécuter, terminé).
Le moteur de grille est conçu pour cela, par exemple, Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) ou Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ ). Vous avez besoin de l'administrateur pour installer le logiciel approprié pour vous avant de commencer. L'administrateur peut être heureux de le faire, au lieu de voir des centaines de processus s'exécuter sur la machine, et n'a aucun contrôle sur eux.
En général, l'administrateur définit le nombre d'emplacements dans lesquels une machine peut être divisée, et vous soumettez un travail à une file d'attente et spécifiez le nombre d'emplacements que le travail veut consommer, le moteur de grille surveillera l'utilisation globale du système et exécutera le travail selon la politique de mise en file d'attente définie par l'administrateur. Par exemple, pas plus de x travaux peuvent s'exécuter en même temps, etc. le reste des travaux sera dans la file d'attente en état d'attente et libéré après la fin des travaux précédents.
la source
Vous pouvez essayer le shell distribué. Télécharger depuis: http://sourceforge.net/projects/dsh/
la source
Je l'ai fait à plusieurs reprises et je lance généralement mon propre script pour faire le travail avec le contrôle des travaux. De manière générique, si vous avez les noms de tous les scripts que vous souhaitez exécuter dans un fichier, la solution ressemble à:
C'est de la force brute, mais efficace. De plus, vous n'avez pas besoin d'ajouter de logiciel supplémentaire comme Parallel à vos systèmes.
Un gros problème est que la commande wait attendra la fin du script le plus lent, ce qui peut perdre du temps. J'ai créé des scripts pour gérer cette situation, mais ils deviennent plus complexes comme vous pouvez l'imaginer. Si tous vos scripts s'exécutent dans le même laps de temps, cela fonctionne bien.
Un autre problème est que vous devrez peut-être régler MAX_PROCS pour déterminer les meilleures performances.
Bien sûr, le nombre de connexions ssh peut devenir lourd. Dans ce cas, déplacez simplement ce script vers l'hôte distant et modifiez la ligne "ssh ..." pour exécuter directement les scripts.
la source