Asynchrone Jobs im Shell-Skript begrenzen

Daemotron

Well-Known Member
Moin,

ich bastle gerade an einem Backup-Skript, bei dem ich folgendermaßen vorgehen will:
  1. markiere den zu sichernden Stand per ZFS snapshot auf allen betroffenen Datasets
  2. arbeite die Snapshots nach und nach ab, mit einer begrenzbaren Anzahl parallel arbeitender Prozesse
Die Idee dahinter: Das Storage Device verträgt es, wenn drei oder vier zfs send Kommandos gleichzeitig laufen, es sind aber regelmäßig ca. 50 Datasets zu sichern. Jetzt grüble ich, wie sich das per Shell-Skript realisieren ließe - natürlich weiß ich prinzipiell, wie man mehrere Prozesse asynchron laufen lässt:
Code:
#!/bin/sh


do_nix() {
    sleep $1
    echo "bin feddich"
    return 0
}

do_nix 6 &
pid1=$!
echo "$pid1 started"
do_nix 4 &
pid2=$!
echo "$pid2 started"

wait

echo "jetz iss alles feddich"
So müsste ich aber 50 Prozesse parallel starten, die wahrscheinlich den Storage in die Knie zwingen würden - oder immer warten, bis alle parallel gestarteten Jobs abgearbeitet sind. Die Frage ist also: Wie bekomme ich eine Art Warteschlange hin, so dass sobald ein Prozess beendet ist, der nächste nachgeschoben wird, bis die Warteschlange abgearbeitet ist?
 
Ist es wirklich schneller vier datasets gleichzeitig zu senden ala hintereinander? Der bottleneck dürften doch disk-io und netz-io sein und nicht die CPU...
 
h^2: Oftmals schon, weil einzelne Jobs blockieren und damit das Bottlenecks nicht die ganze Zeit auslasten.
 
@h^2 Da der Datenstrom noch verschlüsselt und komprimiert wird, hat die CPU schon was zu tun bei der Sache - ich hatte experimentell herausgefunden, dass bei 3 parallelen Jobs das Optimum liegt. Bei mehr verstopft dann disk-io, und der Zielserver kann's nicht mehr schnell genug wegschreiben.
 
Zurück
Oben