Skripte parallelisieren

12.02.2015

Für viele Aufgaben bei meiner täglichen Arbeit mit Linux nutze ich bash-Skripte bzw. tippe sie gleich auf der Komandozeile ein. Es gibt viele Aufgaben welche langwierig sind und leicht parallelisierbar sind. Hier kann das Programm parallel helfen. Im einfachsten Fall stellt man es sich wie eine Art Queueing-System vor. Die Aufgabenpakete werden in eine Warteschlange gesteckt und n Prozesse arbeiten die Warteschlange ab. Wenn man nichts konfiguriert, dann ist n die Anzahl der Prozessorkerne.

Man kann parallel als Ersatz für xargs nehmen oder um Schleifen zu parallelisieren. Auf der Seite von parallel gibt es viele Beispiele, welche über das parallelisieren von Schleifen hinaus gehen.

Aktueller Anwendungsfall

Ich nutze parallel zum erstellen von Backups. Dazu kopiere ich sehr viele kleine Dateien auf eine NFS-Freigabe. Ich habe rsync und cp probiert. rsync ist in meinen Fall langsamer als cp.

Aus diesem Grund habe ich cp, wie folgt parallelisiert:

find . -type f -mtime -2 | parallel --jobs 16 /usr/sbin/backup_helper.sh {}

Es werden alle Dateien gesucht, welche jünger als 2 Tage sind. Diese werden mit 16 parallelen cp auf das NFS-Share kopiert. So bekomme meine 1GBit Netzwerkanbindung während des Backups ausgelastet. Beim sequenziellen kopieren bzw. mit rsync bin ich nicht über 100MBit/s gekommen.

Das script backup_helper.sh sieht wie folgt aus:

cat /usr/sbin/backup_helper.sh
#!/bin/bash

base="$(dirname ${1})"
mkdir -p "/backup/${base}"
cp "${1}" "/backup/${1}"
Kategorien: Linux Tools
Tags: #parallel #bash