OVH Cloud OVH Cloud

Recherche une solution d'execution sur des multi-processeurs

9 réponses
Avatar
Denis Valdenaire
Bonjour,

Je recherche quelque chose d'un peu particulier. Je dispose (par
exemple) de machines =E0 4 ou 8 processeurs. J'ai besoin de gzipper 50
fichiers. Gzip n'=E9tant pas (=E0 ma connaissance) multithread (mais
m=EAme s'il l'=E9tait, ce n'est qu'un exemple, je dis gzipper comme
j'aurais dit parser avec awk) je me retrouve =E0 faire une boucle shell
du genre :

for FILE in `ls *.log`; do gzip -v $FILE; done

et du coup un seul des 4 ou 8 processeurs fonctionne...

Donc, ma question : connaissez vous un utilitaire ou une m=E9thode
simple pour dire "faire tel lot de t=E2ches en parral=E8lle, avec X
t=E2ches simultan=E9es" ? Je pourrais faire une boucle plus =E9labor=E9e,
mais je pense qu'il doit exister des solutions pour ce genre de
choses... Je pense =E0 quelque chose qui ne soit pas au niveau du noyau,
bien sur.

L'id=E9al, c'est que =E7a fonctionne sur plusieurs unix, bien sur :)


Merci d'avance !

Denis Valdenaire

9 réponses

Avatar
Dam
En Perl avec Parallel::Simple peut-être?




Bonjour,

Je recherche quelque chose d'un peu particulier. Je dispose (par
exemple) de machines à 4 ou 8 processeurs. J'ai besoin de gzipper 50
fichiers. Gzip n'étant pas (à ma connaissance) multithread (mais
même s'il l'était, ce n'est qu'un exemple, je dis gzipper comme
j'aurais dit parser avec awk) je me retrouve à faire une boucle shell
du genre :

for FILE in `ls *.log`; do gzip -v $FILE; done

et du coup un seul des 4 ou 8 processeurs fonctionne...

Donc, ma question : connaissez vous un utilitaire ou une méthode
simple pour dire "faire tel lot de tâches en parralèlle, avec X
tâches simultanées" ? Je pourrais faire une boucle plus élaborée,
mais je pense qu'il doit exister des solutions pour ce genre de
choses... Je pense à quelque chose qui ne soit pas au niveau du noyau,
bien sur.

L'idéal, c'est que ça fonctionne sur plusieurs unix, bien sur :)


Merci d'avance !

Denis Valdenaire


Avatar
Nicolas George
"Denis Valdenaire" wrote in message
:
Donc, ma question : connaissez vous un utilitaire ou une méthode
simple pour dire "faire tel lot de tâches en parralèlle, avec X
tâches simultanées" ?


Peut-être make -j 2 dans un cas aussi simple.

Avatar
Pascal Bourguignon
"Denis Valdenaire" writes:

Bonjour,

Je recherche quelque chose d'un peu particulier. Je dispose (par
exemple) de machines à 4 ou 8 processeurs. J'ai besoin de gzipper 50
fichiers. Gzip n'étant pas (à ma connaissance) multithread (mais
même s'il l'était, ce n'est qu'un exemple, je dis gzipper comme
j'aurais dit parser avec awk) je me retrouve à faire une boucle shell
du genre :

for FILE in `ls *.log`; do gzip -v $FILE; done

et du coup un seul des 4 ou 8 processeurs fonctionne...

Donc, ma question : connaissez vous un utilitaire ou une méthode
simple pour dire "faire tel lot de tâches en parralèlle, avec X
tâches simultanées" ? Je pourrais faire une boucle plus élaborée,
mais je pense qu'il doit exister des solutions pour ce genre de
choses... Je pense à quelque chose qui ne soit pas au niveau du noyau,
bien sur.

L'idéal, c'est que ça fonctionne sur plusieurs unix, bien sur :)


np=4
i=$np
for file in *.log ; do
gzip -v "$file" &
i=$(( $i - 1 ))
if [ $i -eq 0 ] ; then wait ; i=$(( $i + 1 )) ; fi
done


Ou:

np=4
files=( "*.log" )
i=0
while [ $i -lt ${#files} -a $i -lt $np ] ; do
gzip -v "${files[$i]}" & i=$(( $i + 1 )) ; done
while [ $i -lt ${#files} ] ; do
wait
gzip -v "${files[$i]}" & i=$(( $i + 1 )) ; done


Une solution simple est d'utiliser batch:

for file in *.log ; do echo "gzip -v "$file"" | batch ; done

Comme batch lance les processus tant que la charge du système est en
dessous de 0.8, ça devrait fonctionner. (S'il y a déjà 2 processus
par processeur, ce n'est pas la peine de faire travailler les gzip en
parallèle...) Mais on n'est pas informé de la completion de tous les
jobs, seulement de chacun des jobs, si on met l'option -m.


--
__Pascal Bourguignon__ http://www.informatimago.com/
Litter box not here.
You must have moved it again.
I'll poop in the sink.

Avatar
Denis Valdenaire
Juste pour info, la solution Perl, j'ai jeté un coup d'oeil, il y a
effectivement des trucs interessants de ce côté, par exemple
Parallel::Jobs; cela dit ça implique de programmer : j'ai rien contre
mais c'est pas mon objectif en ce moment...

Par contre la solution batch me convient tout à fait !

Merci de votre aide

Denis Valdenaire
Avatar
Dam
Re rien... ravi que batch te satisfasse...




Juste pour info, la solution Perl, j'ai jeté un coup d'oeil, il y a
effectivement des trucs interessants de ce côté, par exemple
Parallel::Jobs; cela dit ça implique de programmer : j'ai rien contre
mais c'est pas mon objectif en ce moment...

Par contre la solution batch me convient tout à fait !

Merci de votre aide

Denis Valdenaire


Avatar
fabrice-pas-despame.bacchella
On Thu, 20 Jul 2006 14:22:24 +0200, Pascal Bourguignon
wrote:

Comme batch lance les processus tant que la charge du système est en
dessous de 0.8, ça devrait fonctionner. (S'il y a déjà 2 processus
par processeur, ce n'est pas la peine de faire travailler les gzip en
parallèle...) Mais on n'est pas informé de la completion de tous les
jobs, seulement de chacun des jobs, si on met l'option -m.


Batch travaille sur la file d'attende CPU (load). Pour des processus
consommateurs d'IO, il risque de tous les lancer, sans se rendre compe
que le disque dur est complétement saturé.

Avatar
Pascal Bourguignon
writes:

On Thu, 20 Jul 2006 14:22:24 +0200, Pascal Bourguignon
wrote:

Comme batch lance les processus tant que la charge du système est en
dessous de 0.8, ça devrait fonctionner. (S'il y a déjà 2 processus
par processeur, ce n'est pas la peine de faire travailler les gzip en
parallèle...) Mais on n'est pas informé de la completion de tous les
jobs, seulement de chacun des jobs, si on met l'option -m.


Batch travaille sur la file d'attende CPU (load). Pour des processus
consommateurs d'IO, il risque de tous les lancer, sans se rendre compe
que le disque dur est complétement saturé.


Quand le disque dur est occupé, les autres processus en attente d'I/O
sont dans l'état D qui est un sous état de R, et la charge du
processeur monte.

--
__Pascal Bourguignon__ http://www.informatimago.com/


Avatar
fabrice-pas-despame.bacchella
On Sun, 30 Jul 2006 20:45:05 +0200, Pascal Bourguignon
wrote:

Quand le disque dur est occupé, les autres processus en attente d'I/O
sont dans l'état D qui est un sous état de R, et la charge du
processeur monte.


Vous êtes sur ?
Sur linux :
D = uninterruptible sleep
R = running or runnable
S = Interruptible sleep (waiting for an event to complete)

Solaris ne connait pas l'état D, il y a :
O Sleeping: process is waiting for an event to complete
R Runnable: process is on run queue.

Tout ça c'est pas des sous états, mais des états distinct. Et man
getloadavg parle bien de la run queue, ce que j'interprète comme étant
l'état R. Un read, tout comme select sont en mesure de rendre EINTR,
donc de toute façon on parle de O ou de S, pas de D.

Avatar
Pascal Bourguignon
writes:

On Sun, 30 Jul 2006 20:45:05 +0200, Pascal Bourguignon
wrote:

Quand le disque dur est occupé, les autres processus en attente d'I/O
sont dans l'état D qui est un sous état de R, et la charge du
processeur monte.


Vous êtes sur ?
Sur linux :
D = uninterruptible sleep
R = running or runnable
S = Interruptible sleep (waiting for an event to complete)


C'est le comportement que j'observe sur Linux, quand il y a beaucoup
de process attendant sur le disque dur, ils se retrouvent en D, et
comptent dans le load average.


Solaris ne connait pas l'état D, il y a :
O Sleeping: process is waiting for an event to complete
R Runnable: process is on run queue.

Tout ça c'est pas des sous états, mais des états distinct. Et man
getloadavg parle bien de la run queue, ce que j'interprète comme étant
l'état R. Un read, tout comme select sont en mesure de rendre EINTR,
donc de toute façon on parle de O ou de S, pas de D.


--
__Pascal Bourguignon__ http://www.informatimago.com/

ADVISORY: There is an extremely small but nonzero chance that,
through a process known as "tunneling," this product may
spontaneously disappear from its present location and reappear at
any random place in the universe, including your neighbor's
domicile. The manufacturer will not be responsible for any damages
or inconveniences that may result.