• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Multithreading und Bash...

mikrosaft

Member
Huhu,

ich wollte mein Mehrprozessorsystem mit einem Bashscript etwas optimaler auslasten und das Ergebnis ist nicht wie erwartet (für die Entwicklung des Scriptes steht mir leider kein MP-System zur Verfügung - nur ein P4 mit HT. Vielleicht liegts ja auch daran?).

Es geht um ein Backup-Script. Wenn ich auf konventionelle Art und Weise jede Datei nacheinander bearbeite
Code:
...
( cat ."$FILE" | gzip -9 > /backup/sync"$FILE".gz )
...
kommt folgendes heraus:
Code:
$_ time backup.sh
...
real    25m53.720s
user    13m17.548s
sys     2m54.359s

Soweit, so gut. Jetzt habe ich das Script abgeändert, um mehrere Prozesse parallel laufen zu lassen. Damit will ich die Auslastung des MP-Systems erhöhen:
Code:
function fwaitfor()
{
	PROC=$(jobs | grep Running | wc -l)
	clear; jobs
	# echo;echo
	if [ "$PROC" -gt "4" ]
	then
		usleep 50000
		fwaitfor
	fi
}
...
fwaitfor
( cat ."$FILE" | gzip -9 > /backup/sync"$FILE".gz ) &
...

Funktionieren tut es, die Auslastung des Systems ist gestiegen, aber:
Code:
$_ time backup.sh
...
real    26m42.508s
user    18m9.664s
sys     6m47.853s

Warum dauert die Scriptausführung länger? Liegt es daran, dass das Testsystem nur ein P4 mit Hyperthreading ist, und die Änderung wird auf dem echten Multiprozessor-System schneller laufen?
Das System auf dem das Script dann laufen soll kann ich leider nicht zum testen nehmen...
Oder hab ich mir da selber ins Knie gescriptet? Wie kann man Multithreading sonst mit der Bash nutzen?

Gruss
 
Du hast in der Summe n Prozessorkerne, dann gelten folgende Faustregeln:
* nur n rechenintensive Prozesse (in der Größenordnung SETI@home oder lange (De)kompression, generell alles was lange dauert) gleichzeitig machen Sinn
* nur n+1 reichlich intensive Prozesse die auch etwas nicht-CPU verbraten, also von Disk/Netzwerk lesen/schreiben o.ä. (Kernel compile, (De)kompression)
* mehr als n oder n+1 nur wenn die Summe der Auslastung nicht der Gesamtleistungskapazität entspricht (angenommen ein fiktives Seti@home zieht laut top ständig nur 50% könntest du zwei davon pro Kern laufen lassen)
 
OP
mikrosaft

mikrosaft

Member
Ok, soweit die Theorie.
Wenn ich nun mein Script laufen lasse (auf dem P4-HT) liegt die Last beider (virtuellen) Kerne zwischen 30 und 90% und der Plattendurchsatz schwankt zwischen 2-15MB/sec.
Je nachdem ob ein Thread nur eine Datei kopiert oder ob die Datei durch gzip geleitet wird.
Da anteilmässig mehr kopiert als gepackt wird habe ich den Wert für die max. Anzahl Prozesse so hoch gesetzt. Die Systemlast scheint meinen Wert auch als richtig gewählt zu bestätigen.
Aber: Warum dauert der Gesamtablauf länger als beim sequentiell abgearbeiteten Script?
Da komme ich nicht mit...

Gruss
 
Oben