Task Spooler

Shell Befehle Seriell/Parallel in einer Warteschlange abarbeiten
Hermann | 15. Februar 2021

Für linux gibt es ein schönes Tool zum abarbeiten von Shell-Befehlen. Hier kann man Befehle einreihen und diese werden dann seriell oder teilweise parallel abgearbeitet. Unter Debian ist der task spooler unter dem bin-Namen tsp erreichbar.

Audiobearbeitung aus dem RAM heraus

Bei der Audiobearbeitung in einem Videostream ist nur sehr schlecht auf multicore optimiert. Hier wird für die Audiocodierung nur ein Kern genutzt. Damit die CPU ausgelastet ist, kann man mehrere Videos parallel bearbeiten. Hier sollten aber nicht mehr als verfügbare Threads verarbeitet werden. Auch stell das lesen der Daten ein Problem dar, wenn diese auf Magnetfestplatten liegen. Mittels vmtouch können diese zuvor in den RAM geladen werden um dann die Dateien parallel zu verarbeiten. Als Ziel sollte hier ein schneller Speicher gewählt sein (SSD).

Bash Beispiel

# ramtasks verketten, damit immer nur eine Datei von der HDD gelesen wird
# -D [id]: Auf Task warten mit return errorlevel 0 warten
# -S [num]: Anzahl gleichzeitiger Tasks

# Anzahl concurrent tasks (kann auch von Außen gesetzt werden)
tsp -S 16

# datei in RAM laden
ramtaskid=$(tsp vmtouch -t $file)
# Videoenc Taks erstellen, der nach ramtask startet
videotaskid=$(tsp -D $ramtaskid ffmpeg <<config>> $file -o dest/$file)
# datei aus RAM entfernen, wenn Videotask fertig
tsp -D $videotaskid vmtouch -e $file dest/$file

ramtaskid=$(tsp -D $ramtaskid vmtouch -t $file)
videotaskid=$(tsp -D $ramtaskid ffmpeg <<config>> $file -o dest/$file)
tsp -D $videotaskid vmtouch -e $file dest/$file
...

Bash Durch -D wird sichergestellt, dass immer nur ein ramtask aktiv ist und immer nur eine Datei gelesen wird. Sobald die erste Datei im RAM ist, wird diese auch schon encodiert. Mit -S legt man die Tasks fest, die gleichzeitig laufen können. Hier muss man natürlich auf den RAM achten. Sonst lesen doch wieder alle encoding tasks von der Festplatte.