Was tun, wenn „nett“ nicht gut genug ist (FreeBSD)

8

Ich habe in x265letzter Zeit einige Videos auf meiner Workstation codiert, aber ich habe ein Problem: Obwohl ich sie nice -n 20 x265zum Depriorisieren starte, verlangsamt sie den Computer während der Ausführung immer noch zum Crawlen. Alles funktioniert immer noch, es ist nur ... langsam! Ich sehe sogar Verzögerungen, bevor die Zeichen beim Eingeben eines Terminals erscheinen.

Muss ich damit leben oder gibt es noch andere Dinge, die ich ausprobieren kann?

EDIT: Vielleicht dient das Folgende als Beweis dafür, dass der schöne Wert wirklich angewendet wird x265? Schau dir die NISpalte an.

% ps -awux -O nice | egrep "x265|PID"
USER      PID  %CPU %MEM     VSZ     RSS TT  STAT STARTED       TIME COMMAND            PID NI TT  STAT       TIME COMMAND
nobody  56654 789.3  3.7  785656  623384 11  SN+J 11:56PM    6:05.80 x265 --input-csp 56654 20 11  SN+J    6:05.80 x265 --input-csp i420 --bframes 5 -
Gravitation
quelle
2
Dies könnte ein E / A-Problem sein. Wo leben die Daten? Ein schnelles SSD-Laufwerk könnte helfen.
Michas
Ich vermute sehr, dass es sich eher um ein CPU-Problem als um ein E / A handelt. Das liegt daran, dass ich das Problem mit einem 4-MB-Eingangsvideo (ca. 60 Bilder) reproduzieren kann. Das gesamte Video kann in weniger als einer Sekunde von der SSD gelesen werden. Das Codieren des Videos durch x265 dauert viel länger (weniger als ein Bild pro Sekunde). Und dennoch bleibt das Problem während der gesamten Operation bestehen! Wenn dies nicht ausreicht, werden die Videos (Quelle und Ziel) auf einer dedizierten SSD gespeichert, die für nichts anderes im System verwendet wird.
Gravitation
2
Behält es sein schönes Niveau bei, nachdem Sie es eingestellt haben? Wie viele Threads werden gestartet und wie ist dies im Vergleich zur Anzahl der CPU-Kerne? Wenn es so viele Threads startet oder andere Prozesse abzweigt. Nizza könnte hier nicht helfen ...
Bichoy
1
Hey @BrandonThomson, überprüfen Sie diese Ubuntu-Frage, um die Anzahl der Threads zu erhalten: askubuntu.com/questions/88972/…
Bichoy
3
Überprüfen Sie auch die x265- Dokumentation x265.readthedocs.org/en/latest/threading.html . Möglicherweise müssen Sie nur die Anzahl der von x265 gestarteten Threads steuern. Lassen Sie beispielsweise einen Ihrer 8 Kerne für andere Anwendungen
weg

Antworten:

3

Der FreeBSD-Kernel implementiert so etwas wie einen E / A-Scheduler, nämlich gsched . Beim Überprüfen der Handbuchseite scheint es sich um einen gerätespezifischen E / A-Scheduler zu handeln. Persönlich denke ich, dass dies eine nette Keynote für Echtzeitanwendungen von FreeBSD ist und ein guter Grund, offen nach der vorhandenen FreeBSD-Dokumentation zu suchen.

Obwohl spekulativ, möglicherweise mit dem Blockgerät der Root-Partition, das für die Verwendung eines rrSchedulers konfiguriert ist gsched, und den auf einem separaten Blockgerät gespeicherten Mediendateien, kann es möglicherweise dazu dienen, dass das Betriebssystem in E / A sogar reaktionsfähiger funktioniert mit dem E / A-Engpass?

In Verbindung gschedmit einer Konfiguration für Prozessorprioritäten - z. B. rtprio und / oder idprio - kann dies möglicherweise dazu dienen, die Reaktionsfähigkeit des primären Betriebssystems zu verbessern, selbst unter starker Belastung durch die Verarbeitung von Mediendateien.

Alternativ könnte es möglicherweise möglich sein, mehr Prozessorbandbreite zu gewinnen, wenn die Ports unter CPU-spezifischen Optimierungen kompiliert werden. Auf dem Weg zu diesem Zweck gibt es die MACHINE_CPUARCHund CPUTYPEFelder, so dass in angewendet werden kann /etc/make.conf, und das würde während des Ports Build - Prozess [angewendet werden Manpage ]. Das Handbuch enthält natürlich viele Hinweise zum Erstellen von Ports mit FreeBSD [ Kap . 5 ]. Ich selbst habe mit MACHINE_CPUARCH?=amd64und CPUTYPE?=core2auf einem älteren Toshiba - Laptop. Als LAN-Gateway scheint es in Ordnung zu sein, obwohl ich es nicht unter hoher Last in den Prozessor- oder Block-E / A-Funktionen bewertet habe.

Sean Champ
quelle
2

Manchmal kann eine einzelne schwere E / A-Operation die Kernel-Leistung in Bezug auf alle E / A-Aufnahmen beeinträchtigen, einschließlich derjenigen, die nicht direkt auf dem Gerät der ersten ausgeführt werden.

  • Die erste und indirekte Möglichkeit, die Prioritäten bei der E / A-Planung zu steuern, ist die Optimierung des bereits erwähnten Niveaus des Prozesses. In modernen Linuxes ist ein Prozess mit einem netten Wert von 19 (dh dem Maximum) standardmäßig in der Best-Effort-Klasse mit einer Priorität von (19 + 20) / 5 = 7, der niedrigsten in der Klasse verfügbaren Priorität. Allgemeiner liegt es in [0,7] gemäß einer solchen Abbildungsfunktion.

  • Eine zweite, direkte und leistungsfähigere Möglichkeit zur Steuerung der E / A-Planung besteht darin, manuell in die den Prozessen zugewiesene E / A-Planungsklasse einzugreifen. Dies ermöglicht es uns, einen Prozess auch in zwei zusätzliche Klassen einzuteilen: Echtzeitklasse mit höherer Priorität als Best-Effort-Level 0 und Leerlaufklasse mit niedrigerer Priorität als Best-Effort-Level 7. Letzteres garantiert theoretisch, dass keine andere E / A. Die Operation könnte jemals auf eine im Leerlauf geplante Prozessoperation warten. Ähnlich wie beim niceBefehl ionicekönnen Sie einen Prozess mit einer bestimmten Priorität erzeugen oder die Prioritäten eines vorhandenen Prozesses ändern. Weitere Informationen zu diesem Tool und zur E / A-Planung auf Linux-Kerneln im Allgemeinen finden Sie in der Ionice-Manpage .

Haben Sie dennoch versucht, Ihren Prozess mit zu starten ionice -c 3 x265 ...?

PS Entschuldigung, ich habe das 'FreeBSD'-Tag in der Frage bemerkt, nachdem ich meine Antwort gepostet habe, die möglicherweise wie folgt zusammenbricht.

Ich glaube nicht, dass FreeBSD einen E / A-Planer hat. Sie können in Betracht ziehen, Ihre Arbeit an einer Linux-Box auszuführen, die diese hat und mit der Sie ganz einfach spielen können.

Marco Solieri
quelle
1
Keine Sorge, Kumpel, ich bin sicher, dass die Details für viele andere nützlich sein werden, die diesen Thread durchsuchen =)
Gravitation
0

Sie wollen "rctl"

sehen:

man rctl

Hiermit können Sie Ressourcen pro Benutzer, pro Prozess, Gefängnis oder Anmeldeklasse zuweisen. Z.B

# user root, maximum reads of 400 transfers per sec (tps) per the whole user :
rctl -a user:root:readiops:throttle=400/user

# user root, maximum reads of 30Mb per sec (31,457,280 bytes) per the whole user :
rctl -a user:root:readbps:throttle=31457280/user
Jamie Landeg-Jones
quelle