Wie kann ich Linux für die Kodierung großer Videomengen oder einer Reihe gleicher CPU-intensiver Aufgaben optimieren?

Wie kann ich Linux für die Kodierung großer Videomengen oder einer Reihe gleicher CPU-intensiver Aufgaben optimieren?

Ich habe 4-5 Maschinen, die fast den ganzen Tag und manchmal auch die ganze Nacht lang ausschließlich Videos kodieren. Ich habe oft nach Möglichkeiten gesucht, sie für diesen Zweck zu optimieren, aber ohne Erfolg.

Meine Prämisse: Ich sollte in der Lage sein, fast meine gesamte CPU für die Videokodierung zu verwenden, wenn und nur wenn ich mehrere Kodierungsprozesse gleichzeitig ausführe, was bei mir der Fall ist.

Das Problem: ( von 'oben' )

Aufgaben: 382 insgesamt, 2 laufen, 380 schlafen, 0 angehalten, 0 Zombie
% CPU(s): 51,6 us, 36,8 sy, 0,0 ni, 9,6 id, 0,0 wa, 2,0 hi, 0,0 si, 0,0 st
KiB-Speicher: 16425680 gesamt, 16171664 genutzt, 254016 frei, 30492 Puffer
KiB Swap: 16769020 gesamt, 406056 genutzt, 16362964 frei. 15198692 zwischengespeicherter Mem

  PID USER PR NI VIRT RES SHR S %CPU %MEM ZEIT+ BEFEHL                                                                                                                         
31308 Wurzel 20 0 486568 26000 5560 S 92,2 0,2 ​​188:10,72 avconv                                                                                                                          
10340 Wurzel 20 0 475832 19920 5532 S 91,2 0,1 13:40,42 avconv                                                                                                                          
12547 Wurzel 20 0 473832 23672 5528 S 89,9 0,1 5:40,23 avconv                                                                                                                          
 8179 Wurzel 20 0 477132 21200 5560 S 89,2 0,1 71:50,15 avconv                                                                                                                          
 9059 Wurzel 20 0 472776 17960 5540 S 89,2 0,1 48:12,62 avconv                                                                                                                          
 9798 Wurzel 20 0 477812 16976 5532 S 88,9 0,1 25:23,15 avconv                                                                                                                          
 8725 Wurzel 20 0 476068 21696 5560 S 87,2 0,1 62:12,02 avconv                                                                                                                          
12657 Wurzel 20 0 472332 22012 5524 S 86,9 0,1 6:21,28 avconv                                                                                                                          
12915 Wurzel 20 0 473732 41888 5516 S 86,6 0,3 5:22,63 avconv                                                                                                                          
 8578 Wurzel 20 0 476840 24100 5536 S 85,6 0,1 63:17,07 avconv                                                                                                                          
 7822 Wurzel 20 0 472740 18940 5536 S 85,2 0,1 75:22,04 avconv                                                                                                                          
 9948 Wurzel 20 0 485420 18116 5560 S 84,9 0,1 22:18,23 avconv                                                                                                                          
 7356 Wurzel 20 0 476744 20084 5560 S 84,6 0,1 92:31,91 avconv                                                                                                                          
 9425 Wurzel 20 0 471096 19684 5552 S 82,9 0,1 37:48,28 avconv                                                                                                                          
12464 Wurzel 20 0 475004 24304 5532 R 81,6 0,1 6:30,16 avconv

Obwohl ich 14 verschiedene Videodateien gleichzeitig kodiere, beträgt die CPU-Auslastung nur etwa 50-55 %. Wenn ich weniger Streams gleichzeitig laufen lasse, werden die einzelnen Streams bis zu 400 % CPU-Auslastung haben, während sie wie oben abgebildet nur etwa 80-90 % CPU-Auslastung haben.

Das ist das Einzige, was diese Box tun soll. Ist es möglich, die CPU-Leistung besser zu nutzen, oder ist meine Annahme falsch?

Ich habe bisher mit Renice experimentiert, aber es hat absolut nichts bewirkt. Ich habe NI auf -20 und 19 eingestellt, aber die CPU-Auslastung war insgesamt oder bei einzelnen Kodierungen nicht höher oder niedriger.

Ich habe einiges über vm.swappiness gelesen, aber mir ist nicht klar geworden, ob für meinen Anwendungsfall mehr oder weniger Swappiness besser wäre. Könnte dies die Leistung steigern?

Weitere Details: Die Maschine, von der ich das Top einschließe, ist ein Dell R900 mit Ubuntu 14.04. cat /proc/cpuinfolistet 16 Intel(R) Xeon(R) CPU E7330 @ 2,40 GHz-Prozessoren und cat /proc/meminfo16 GB RAM auf. Die anderen Maschinen in der Gruppe sind ähnlich und zeigen das gleiche Verhalten. All diese Kodierungen sind DV-Video zu MPEG2-Video, manchmal kodieren wir auch andere Arten von Video. Die Quelle für diese Kodierungen ist ein vernetzter RAID, der zum Zeitpunkt des Top-Beitrags oben nichts schreibt und Lesegeschwindigkeiten von über 300 Mb/s erreicht. Das Ziel sind ebenfalls vernetzte RAIDs, nicht ganz so schnell, aber die resultierenden MPEG-Daten sind viel kleiner als die Eingabedaten.

Antwort1

Erstens beschleunigt eine High-End-GPU die Kodierung um ein Vielfaches. Normalerweise verkürzt eine High-End-Grafikkarte das Rendern von Stunden auf Minuten. Möglicherweise benötigen Sie eine NVIDIA-GPU.

‘-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)’

    Select a device to use for hardware acceleration.

    This option only makes sense when the ‘-hwaccel’ option is also specified. Its exact meaning depends on the specific hardware acceleration method chosen.
    ‘vdpau’

        For VDPAU, this option specifies the X11 display/screen to use. If this option is not specified, the value of the DISPLAY environment variable is used
    ‘dxva2’

        For DXVA2, this option should contain the number of the display adapter to use. If this option is not specified, the default adapter is used. 

Zusätzlich benötigen Sie dies für die CPU

‘-threads[:stream_specifier] integer (input/output,video)’

    Possible values:

    ‘auto’

        autodetect a suitable number of threads to use 

verwandte Informationen