#1 Le 08/04/2013, à 18:02
- BrunoL
[Resolu]Traitement paralléle et ligne de cde
Bonjour,
J'essaie de peaufiner un script qui me transforme en masse des fichiers raw (10.000) vers du jpg.
Le sésame est ufraw-batch qui s'en sort très bien mais c'est un peu long. Ce qui me gave car j'ai à disposition un proc à 8 cœurs et globalement 1 bosse et les 7 autres glandouillent.
D'où ma question, est-il possible d'affecter en ligne commande des traitements à différents proc. ? chaque traitement d'un fichier étant indépendant.
Merci.
Euh le script& , j'ai donné ... ;-)
Dernière modification par BrunoL (Le 13/04/2013, à 10:22)
Hors ligne
#2 Le 08/04/2013, à 18:36
- Brunod
Re : [Resolu]Traitement paralléle et ligne de cde
A priori, rien n’empêche de lancer plusieurs fois le script.
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#3 Le 08/04/2013, à 18:43
- Hizoka
Re : [Resolu]Traitement paralléle et ligne de cde
mais je ne crois pas que ca fera travailler les differents coeurs...
pour la prise en charge des coeurs, il faut que le logiciel qui est executé soit programmé pour les utiliser
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 08/04/2013, à 19:12
- Brunod
Re : [Resolu]Traitement paralléle et ligne de cde
Tu lances plusieurs instances en // et chacune passe sur un coeur. C'est en tout cas ainsi que ça se passe sur mon bi xeon.
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#5 Le 08/04/2013, à 20:03
- BrunoL
Re : [Resolu]Traitement paralléle et ligne de cde
Mon idée serait de scruter l'utilisation cpu genre top -b -n1|grep ...
et tant qu'un certain niveau n'est pas atteint de lancer des job unitaires en &
wait après que ce niveau soit atteint etc...
Mais c'est de la théorie car je n'arrive pas à comprendre comment on trouve l'activité moyenne des procs
Je continue à chercher car à vu de nez je compterai bien sur une division par 2 du délai de traitement
Hors ligne
#6 Le 09/04/2013, à 06:59
- serged
Re : [Resolu]Traitement paralléle et ligne de cde
J'ai un script de "stress" de CPU (c'est une simple boucle sans fin). Je le lance dans plusieurs terminaux et le moniteur système me montre bien que les cœurs sont occupés.
Note pour BrunoL : On peut calculer plus simplement (dans un script) la charge des processeurs avec /proc/loadavg
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#7 Le 09/04/2013, à 12:33
- BrunoL
Re : [Resolu]Traitement paralléle et ligne de cde
Merci serged pour /proc/loadavg nettement meilleur pour mon usage que top. Je vais voir le manuel.
Hors ligne
#8 Le 09/04/2013, à 15:09
- obibann
Re : [Resolu]Traitement paralléle et ligne de cde
N'y a-t-il pas moyen de s'en sortir avec la commande "taskset" ?
Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p
Hors ligne
#9 Le 13/04/2013, à 10:22
- BrunoL
Re : [Resolu]Traitement paralléle et ligne de cde
Je m'en suis sorti avec
cat /proc/stat | grep '^cpu '
et un gros coup de pouce de Paul Colby
Je comprends pas vraiment cette cuisine de moyenne proc et autre IDLE mais je lui fais confiance.
En pratique cela fonctionne et sur un échantillon (87 fichiers) le temps est divisé par environ 2,5. Je passe effectivement de 35% de cpu utilisée au compteur du moniteur système à ... 100%. Ma ram commence à charger et je pense que c'est là que je risque avoir chaud
La semaine prochaine je renvoi cela sur le stock réel je verrai si cela se concrétise.
Bon WE et merci pour votre aide.
Hors ligne
#10 Le 13/04/2013, à 13:24
- Hizoka
Re : [Resolu]Traitement paralléle et ligne de cde
tu pourras nous detailler ce que tu auras fait si c'est ok stp ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 15/04/2013, à 19:00
- BrunoL
Re : [Resolu]Traitement paralléle et ligne de cde
C'est OK le délai de traitement a été divisé par 3 (1h au lieu de 3!).
J'ai fait exactement ce que je répondais à BrunoD.
Mieux qu'une longue explication le script qui m'a permis de tester ma solution. Il appelle le script consoCpu.sh qui consomme quelques minutes de processeur. Ce qui m'importait c'est le parcours de l’arborescence de départ sans faire des paquets à la main comme le suggérait BrunoD et surtout d'éviter que la machine s'effondre comme cela c'est produit lorsque j'ai envoyé tout en & en croyant que le scheduler allait s'en dépatouiller
La perle c'est consoCpuTot() trouvée ici.
Je traite le répertoire ~/Téléchargement parce que ...
#!/bin/bash
#
# structure d'un traitement en parallèle
#Pour bourrer les cœurs disponibles
consoCpuTot ()
{
PREV_TOTAL=0;PREV_IDLE=0;periode=0;CUM_DIF_USAGE=0;MOY_DIF_USAGE=0
while [ $periode -lt 5 ]; do
CPU=(`cat /proc/stat | grep '^cpu '`)
unset CPU[0]
IDLE=${CPU[4]}
TOTAL=0
for VALUE in "${CPU[@]}"; do
let "TOTAL=$TOTAL+$VALUE"
done
let "DIFF_IDLE=$IDLE-$PREV_IDLE"
let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"
let "DISPO=100-$DIFF_USAGE"
PREV_TOTAL="$TOTAL"
PREV_IDLE="$IDLE"
let "CUM_DIF_USAGE=$CUM_DIF_USAGE+$DIFF_USAGE"
sleep 0.5
let "periode=$periode+1"
done
let "MOY_DIF_USAGE=$CUM_DIF_USAGE/$periode"
}
#
jobLancer()
{
JOB_ENCOURS=`ps hax|egrep -w '[c]onsoCpu.sh'|wc -l`
consoCpuTot
if [ $JOB_ENCOURS = 0 ]; then JOB_ENCOURS=1; fi
let "JOB_LANCER=$DISPO/($MOY_DIF_USAGE/$JOB_ENCOURS)"
echo "=== DISPO="$DISPO "MOY_DIF_USAGE="$MOY_DIF_USAGE "JOB_ENCOURS="$JOB_ENCOURS "***" >> $ficLog
}
premier=0; JOB_ENCOURS=0;JOB_LANCER=2
repScript="/home/bruneau/work/consoProcess"
ficLog="$repScript/log_"${0#*/*} # nom script sans chemin
repSrce="/home/bruneau/Téléchargements"
echo "début du job : `date +%Y-%m-%d_%Hh%Mmn`" > $ficLog
shopt -s globstar
for file in $repSrce/**
do
if [ "$JOB_LANCER" -gt 0 ]; then
echo -e "+++ Je lance traitement de" $file "\tà "`date +%Hh%Mmn%Ssec%N`"! +++" >> $ficLog
#traitGlobal
"$repScript/"consoCpu.sh&
let "JOB_LANCER=$JOB_LANCER-1"
fi
while [ $JOB_LANCER = 0 ];
do
echo -e "--- je ne peux rien lancer \tà "`date +%Hh%Mmn%Ssec%N`"! ---" >> $ficLog
jobLancer
done
echo "intermed : `date +%Y-%m-%d_%Hh%Mmn%Ssec`; JOB_LANCER ="$JOB_LANCER "JOB_ENCOURS="$JOB_ENCOURS >> $ficLog
done
echo "fin du job : `date +%Y-%m-%d_%Hh%Mmn%Ssec`" >> $ficLog
On peut faire mieux car par moment l'utilisation des proc dans le traitement réel passé à 14% et 35%. N'hésitez pas à l'améliorer.
J'espère avoir été clair.
Dernière modification par BrunoL (Le 15/04/2013, à 19:03)
Hors ligne