Letzt habe ich Videos umgerechnet mit ffmpeg. Das passiert immer wieder und dauert lang. Es darf im Hintergrund passieren, es darf lang dauern, es soll irgendwann fertig werden, Aber es soll nicht die weitere Tätigkeit des kompletten Proxmox-Servers lahmlegen, in dem die Ubuntu-VM läuft. Oder auch nur die Ubuntu-VM, die weitere Aufgaben hat.
Also habe ich 2 ffmpeg-Tasks (gestartet im tmux) gleichzeitig mit top verfolgt, was geschieht. Insgesamt gibt es 200% CPU, beide Prozesse bekommen etwa 95-100% zugeteilt. Das ist ok, aber es lastet das System aus. Ziel wäre, dass beide je etwa 80% verwenden und somit 40% CPU immer verfügbar wären.
Nun habe ich einen Prozess mit cpulimit -p<PID> -l180 auf 180% gesetzt, dass er nicht mehr als 180% verwendet. Erwartet habe ich, dass sich das nicht auswirkt, weil die zugeteilte Leistung sowieso deutlich unter 180% ist. Plan war, den anderen Prozess, der IO-technisch auf dem gleichen NAS auf echter Platte arbeitet, mit kill -STOP anzuhalten, da nur eine Berechnung gleichzeitig eher schneller sein sollte als 2 (die die Platten immer wieder woanders beschäftigen), und wenn der erste fertig ist, mit kill -CONT fortzusetzen. Erstaunt war ich, dass ein Prozess, der ohne einen solchen Eingriff normal etwa 95% verwendet, nach cpulimit -l180 bei 180% liegt! Das bedeutet, dass er durch das Limit deutlich höhere Priorität erhalten hat! Das möchte ich nicht. Ich arbeite mit renice auf Prio 15, um die Priorität von Hintergrundtasks gering zu halten, damit Echtzeittasks (wie Fernsehaufnahmen aus DVB-C, die in HD kritisch sein könnten) auf jeden Fall oft genug dran kommen. Gerne möchte ich die CPU nicht über Stunden vollständig auslasten.
Wie ist hier die richtige Vorgehensweise, um eine vernünftige Lösung zu erhalten?
Meine erste Idee ist die Einteilung in Gruppen für Tasks. Alles was Echtzeit benötigt (naja, Puffer gibt es ja bei Streams, bei mir meist 1,5 Sekunden - Echtzeit ist übertrieben) behält die normale Priorität, nicht zeitkritische Hintergrundaufgaben werden mit renice auf Prio 15 gesetzt. Aber wie sage ich, dass die Summe der unkritischen Prozesse nicht über sagen wir mal 100-150% gehen soll, ohne dass sie eine höhere Priorität erhalten? Gibt es eine Alternative zu cpulimit, die den task nicht in der Priorität erhöht, oder habe ich bei cpulimit eine Option übersehen?