
Ich weiß, dass es wie in anderen Betriebssystemen Prozessprioritäten gibt, die von -20 (höchste Priorität) bis 19 (niedrigste Priorität) reichen, aber Linux scheint sie zu ignorieren.
Gerade habe ich im Hintergrund den Kernel erstellt (obwohl make
Prozesse Priorität 0 haben) und da das ziemlich lange gedauert hat, habe ich beschlossen, mir etwas anzusehen. Also habe ich ein ziemlich anspruchsvolles H264-Video (~30 % der CPU-Zeit eines Core2 2,6 GHz) in VLC geöffnet und festgestellt, dass es zu Rissen, verlorenen Frames und visuellen Artefakten kam (vermutlich aufgrund des vorherigen), obwohl der Ton in Ordnung zu sein schien.
Also habe ich beschlossen, die Priorität von VLC zu ändern renice
. Als ich sah, dass PulseAudio dies tat, habe -11
ich beschlossen, es auf die gleiche Stufe zu stellen, und das habe ich getan sudo renice -11 -p VLC_PROC_#
.
Das Gleiche passierte immer wieder, also habe ich es auf -20 eingestellt, aber ich habe immer noch visuelle Artefakte gesehen.
Ich frage mich also, warum Linux einem -20-Prozess nicht tatsächlich Priorität gegenüber einigen 0-Prozessen einräumt und ihm alles gibt, was er braucht? Gibt es eine Möglichkeit, Prozesse in Linux wirklich zu priorisieren?
Falls es wichtig ist: Ich verwende hier einen 64-Bit-Arch und XFCE als Desktopumgebung.
BEARBEITEN:Die Kernelkompilierung wurde durchgeführt, /tmp
wobei ich die Quellen habe tmpfs
und alle bereits im RAM waren. Die RAM-Nutzung erreichte nicht einmal 60 % und es waren keine Paging-Operationen vorhanden.
Das oben beschriebene Szenario ist nur einTestfall, mich interessiert mehr, warum Linux eine bestimmte Leistung erbracht hat und ob es eine Möglichkeit gibt, echte Prioritäten festzulegen.
Antwort1
renice
beeinflusst die Priorität eines Prozesses. Aber wie Sie erfahren haben, bedeutet eine höhere Priorität eines Prozesses nicht automatisch, dass er auch über alle benötigten Ressourcen verfügt. Eine höhere Priorität gibt dem Prozess lediglich eine größere Chance, Ressourcen zu ergattern.
renice
wirkt sich nur auf die CPU-Zeit aus. Es hat also nur dann einen Effekt, wenn zwei oder mehr Prozesse um die CPU-Zeit konkurrieren. Wenn der limitierende Faktor nicht die CPU-Zeit, sondern die I/O-Bandbreite ist, hat der Nice-Wert keine Auswirkungen. Vielleicht verbraucht die Kompilierung in Ihrem Fall viel Festplattenbandbreite und VLC kann die Daten nicht schnell genug von der Festplatte lesen. Versuchen Sieionice
stattdessen oder zusätzlich zu nice
.
Wenn Sie dies häufig tun, erhalten Sie bessere Ergebnisse, wenn sich das Video und die Zusammenstellung auf getrennten Datenträgern befinden. Sie erhalten möglicherweise auch bessere Ergebnisse, wenn Sie das Video vorab in den Datenträgercache laden ( cat /path/to/video.file >/dev/null
oder tail -c +456m | head -c 123m /path/to/video.file >/dev/null
123 MB ab Offset 456 MB lesen) – wenn Sie jedoch nicht über viel RAM verfügen, wird die Zusammenstellung wahrscheinlich den Cachespeicherplatz zurückfordern. Wenn Sie sicher sein möchten, dass das Video im Speicher ist, erstellen Sie eine Ramdisk und kopieren Sie das Video darauf.
Antwort2
Die Prozesspriorität ist nicht das einzige, was ins Spiel kommt, wenn Sie versuchen, zu optimierenBenutzererfahrung. Das Kompilieren des Kernels ist eine ziemlich I/O-lastige Angelegenheit - viel Lesen/Schreiben von/in kleine Dateien, was das Dateisystem ziemlich ausdehnen kann (es gibt einen Grund, warum es manchmalals eigenständiger Maßstab verwendet), insbesondere auf einem Multiprozessor-Rechner. Wenn Sie über genügend RAM verfügen, empfehle ich Ihnen, den Kernel zumindest teilweise in tmpfs zu kompilieren: Legen Sie entweder den Quellbaum dort ab (was effektiv als Vorabruf in den Cache fungiert) oder senden Sie die Ausgabe dorthin, indem Sie
make O=/dev/shm ...
oder wo auch immer Sie Ihre Instanz bereitstellen möchten, tmpfs
die groß genug ist, um die Kernelobjektdateien aufzunehmen (die leicht im Gigabyte-Bereich liegen können).
Außerdem kannst du auch prüfen, ob VLC eine Caching-Funktion hat (ich vermute, dass er das hat, MPlayer hat diese -cache
Option beispielsweise), mit der du die Daten intern zwischenspeichern lassen kannst. Dann muss er die Daten nicht erst abrufen, wenn er sie braucht, sondern wenn sie verfügbar sind.
Eine weitere Sache ist, dass die Anzeige über den X-Server erfolgt – dessen Priorität müsste ebenfalls erhöht werden (siehe den Kommentar von Wumpus Q. Wumbley unter der Frage).
Zwei weitere Optionen sind die Verwendung von cgroups und/oder RT-Scheduler (für die erste siehe z. B.Steuern der Priorität von Anwendungen mithilfe von Kontrollgruppen, für Letzteres siehe z. B. dieGentoo-Anweisungen).
Als letztes möchten Sie vielleicht Ihr System ein wenig optimieren, indem Sie unnötige Dienste deaktivieren. Persönlich würde ich PulseAudio als ersten Dienst in Betracht ziehen.
Was Sie beschreiben, klingt jedoch eher nach einem I/O mit hoher Priorität. Ich vermute, Sie haben ein starkes Swapping erlebt. Sind Sie sicher, dass Ihr tmpfs nicht zwangsweise ausgelagert wurde? In diesem Fall wird zumindest iorenice leider keine große Hilfe sein.
Antwort3
Wie andere bereits gesagt haben, können viele Teile eines Systems betroffen sein, einschließlich der Speicherbandbreite, und diese anderen Teile des Systems haben ebenfalls ihre eigene Planung und Prioritäten.
Sie können chrt -i 0
der Kompilierung immer echte Leerlaufpriorität geben.
http://linux.die.net/man/1/chrt
Oder drosseln Sie die Kompilierung mithilfe von cgroups. http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups.html
Oder werfen Sie alles darauf:
eatmydata cgexec -g cpu:throttled chrt -i 0 ionice -c3 nice -n19 /path/to/compile-script >/dev/null
Hinweis: nice -n19
Es sollte keinen Unterschied machen, ob chrt -i 0
es verwendet wird, aber es schadet auch nicht.
Mein altes P4 kann dasselbe, ohne dass VLC sich aufregt.