So ändern Sie die Einstellungen für ffmpeg -threads

14

Arbeiten an einer Tube- Site. Ich starte Videos über ffmpeg auf einem Linux- Server, um sie in mp4 umzuwandeln .

Die Serverspezifikationen:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Das Problem beim Testen ist, dass selbst wenn nur 4-5 auf einmal ausgeführt werden, die Auslastung des Servers schnell auf durchschnittlich 36 steigt. Dies ist nur eine einzelne Person. Ich stelle mir vor, wenn es geöffnet wird, werden viele Leute auf einmal hochladen.

Es scheint ffmpeg versucht, alle verfügbaren Ressourcen pro Conversion zu nutzen.

Ich habe gehört, dass Sie die Einstellung -threads ändern können, aber ich kann sie nicht finden. Ich habe einen 8-CPU-Server. Es wird nur für Konvertierungen verwendet, daher habe ich gehört, dass die beste Einstellung zwischen 2 und 4 liegt. Ich kann es testen.

Aber wie ändere ich diese Einstellung? Alles, was ich online sehe, behandelt diese Einstellung, aber nicht die Schritte, um sie zu ändern.


quelle

Antworten:

17

Das Options-Flag, das Sie wollen, ist wirklich gerecht -threadsund Sie würden es so verwenden (für nur einen Thread):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

Es gibt jedoch einige Feinheiten, die die Serverauslastung und die Betriebszeit erhöhen, wie z. B. die Neuskalierung, das Anwenden von Filtern und die endgültige Frame-Qualität / Frame-Rate - ganz zu schweigen von der Tatsache, dass einige VM-Architekturen tatsächlich alles zweimal lesen und schreiben (einmal nativ) und einmal virtuell !!!)

Hier sind ein paar Tipps, um Ihre Geschwindigkeit zu steigern:

  1. Verwenden Sie eine Warteschlange, damit immer nur ein Element gleichzeitig transkodiert wird
  2. Fordern Sie kleinere Dateien von Ihren Benutzern an
  3. Nutze die volle Leistung deiner Maschine, indem du:
    • Lesen und Schreiben von einer Ramdisk
    • Wechsel zu Bare Metal für Transcodierungsaufgaben
    • verwenden -threads 0

Was auch immer Sie tun, informieren Sie Ihre Benutzer über den Transcodierungsprozess, da dies nur einige Zeit in Anspruch nimmt. (IJTT)

[Befehl bearbeitet, um LordNeckbeards Kommentar wiederzugeben]

denjello
quelle
10
Optionsplatzierung ist wichtig. Mit -threadsvor dem Eingang wenden Sie diese Option auf den Eingang (den Decoder) an. Eine verallgemeinerte Verwendung ist ffmpeg [global options] [input options] -i input [output options] output.
Logan
Wo würden Sie vorschlagen, es zu platzieren? Ich dachte am Anfang, dass es global angewendet wird?
Denjello
3
Als Ausgabeoption wird es also zu einer Kodierungsoption. Sehen Sie in der FFmpeg-Dokumentation nach, welche Optionen als markiert sind (global).
Logan
Ist es wichtig, ob Sie das -threadsArgument vor oder nach dem -iArgument setzen? Wie soll ich außerdem bestimmen, wie viele Threads ich verwenden soll? Ich mache im Grunde nur-c copy
chovy
3

Das mag ein bisschen alt sein, aber das klingt nach einer perfekten Aufgabe für einen Container wie Docker.

  • Lass ffmpeg mit laufen full horsepower(wie denjello es nannte)
  • aber lass es in docker laufen

Jetzt können Sie den Ressourcenverbrauch einer einzelnen ffmpeg-Instanz einschränken, ohne auch nur die ffmpeg-Befehlszeilenoptionen zu verwenden. Und nicht nur CPU, sondern auch Speicher und IOs.

Mehr noch: Vielleicht haben Sie verschiedene Aufgaben, die möglicherweise im Hintergrund ausgeführt werden, und es ist Ihnen egal, wie lange sie dauern, und Sie haben Aufgaben, die schnell ausgeführt werden sollen, damit Sie verschiedene Aufgaben bewerten können.

Siehe https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources

Auf github gibt es bereits ein vordefiniertes ffmpeg-Image: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

Eine einzelne Konvertierung wird aufgrund des Overheads wahrscheinlich langsamer ausgeführt. Wenn Sie jedoch mehrere Instanzen gleichzeitig ausführen, kann dies ein großer Vorteil sein. Alle diese Funktionen lassen sich sehr gut skalieren, ganz zu schweigen von der verbesserten Sicherheit, da jede Aufgabe vom zugrunde liegenden Betriebssystem isoliert ist.

Jürgen Steinblock
quelle
Ist es nicht ein bisschen extrem, es im Docker laufen zu lassen? Es gibt buchstäblich viele andere bessere Möglichkeiten zur Begrenzung Prozessorauslastung auf Linux scoutapm.com/blog/...
yurtesen
Warum? Bedenken Sie, dass Docker bereits installiert ist, und führen Sie einen Container mit --rmFlag aus, um eine Aufgabe auszuführen und den Container nach dem Beenden zu entfernen. Dies ist eine ganz normale Sache, die Administratoren 2019 tun könnten und sollten. Insbesondere für Dinge wie die Dokumentenkonvertierung. Konvertierung schlägt fehl? Versuchen Sie es mit einer anderen Konverter-Version, ohne Ihre lokale Toolchain zu aktualisieren / zu downgraden? Sie trauen dem Dokument nicht, weil es aus dem Internet heruntergeladen wurde? Isolieren Sie die Aufgabe in einem Container. Ffmpeg ist keine Ausnahme. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Jürgen Steinblock
Das klingt nach Marketinggespräch. Docker ist nicht perfekt, wie Sie es sagen -> techbeacon.com/security/… Unter Linux genießt ein normaler Benutzer auch eingeschränkten Zugriff und eingeschränkte Systemsicherheit. Programmversions-Downgrades sind sehr selten und können über das Repository durchgeführt werden. Viele Docker-Bilder werden von zufälligen Personen erstellt. Möglicherweise wurde das Docker-Image des Dokumentkonverters kompromittiert und eine Kopie aller Ihrer Dokumente an einen Remote-Server gesendet. Die Verwendung von Docker-Bildern erhöht also die Wahrscheinlichkeit einer solchen Sicherheitsanfälligkeit. Was dann?
Jurten
Perhaps the document converter docker image was compromised and sent copy of all your documents to a remote server. So, using docker images increase possibility such vulnerability. What then?Checken Sie das Repo aus, untersuchen Sie die Docker-Datei und docker build -t myimageerstellen Sie selbst ein lokales Image. Oder erstelle dein eigenes Dockerfile, es ist kein Hexenwerk github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Jürgen Steinblock