大量のビデオや CPU を集中的に使用する一連のタスクをエンコードするために Linux を最適化するにはどうすればよいでしょうか?

大量のビデオや CPU を集中的に使用する一連のタスクをエンコードするために Linux を最適化するにはどうすればよいでしょうか?

私は 4 ~ 5 台のマシンを所有しており、ほぼ一日中、時には夜通しビデオをエンコードしています。この目的のためにマシンを最適化する方法を何度も探しましたが、成功しませんでした。

私の前提: 複数のエンコード プロセスを同時に実行している場合に限り、CPU のほぼすべてをビデオ エンコードに使用できるはずです (実際にそうしています)。

問題: ( 'top' より )

タスク: 合計 382、実行中 2、スリープ中 380、停止中 0、ゾンビ 0
%CPU: 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 メモリ: 合計 16425680、使用済み 16171664、空き 254016、バッファ 30492
KiB スワップ: 合計 16769020、使用済み 406056、空き 16362964。キャッシュされたメモリ 15198692

  PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド                                                                                                                         
31308 ルート 20 0 486568 26000 5560 S 92.2 0.2 188:10.72 avconv                                                                                                                          
10340 ルート 20 0 475832 19920 5532 S 91.2 0.1 13:40.42 avconv                                                                                                                          
12547 ルート 20 0 473832 23672 5528 S 89.9 0.1 5:40.23 avconv                                                                                                                          
 8179 ルート 20 0 477132 21200 5560 S 89.2 0.1 71:50.15 avconv                                                                                                                          
 9059 ルート 20 0 472776 17960 5540 S 89.2 0.1 48:12.62 avconv                                                                                                                          
 9798 ルート 20 0 477812 16976 5532 S 88.9 0.1 25:23.15 avconv                                                                                                                          
 8725 ルート 20 0 476068 21696 5560 S 87.2 0.1 62:12.02 avconv                                                                                                                          
12657 ルート 20 0 472332 22012 5524 S 86.9 0.1 6:21.28 avconv                                                                                                                          
12915 ルート 20 0 473732 41888 5516 S 86.6 0.3 5:22.63 avconv                                                                                                                          
 8578 ルート 20 0 476840 24100 5536 S 85.6 0.1 63:17.07 avconv                                                                                                                          
 7822 ルート 20 0 472740 18940 5536 S 85.2 0.1 75:22.04 avconv                                                                                                                          
 9948 ルート 20 0 485420 18116 5560 S 84.9 0.1 22:18.23 avconv                                                                                                                          
 7356 ルート 20 0 476744 20084 5560 S 84.6 0.1 92:31.91 avconv                                                                                                                          
 9425 ルート 20 0 471096 19684 5552 S 82.9 0.1 37:48.28 avconv                                                                                                                          
12464 ルート 20 0 475004 24304 5532 R 81.6 0.1 6:30.16 avconv

一度に 14 個の異なるビデオ ファイルをエンコードしているにもかかわらず、CPU 使用率は 50 ~ 55% 程度にとどまっています。一度に実行するストリームが少ない場合、個々のストリームは最大で約 400% の CPU を使用しますが、上図に示すように、使用率は約 80 ~ 90% です。

これが私がこのボックスに期待する唯一のことですが、CPU パワーをさらに活用することは可能でしょうか、それとも私の前提に欠陥があるのでしょうか?

これまで renice を試してきましたが、まったく効果はありませんでした。NI を -20 と 19 に設定しましたが、全体または個々のエンコードでの CPU 使用率は増加も減少もしませんでした。

vm.swappiness について少し調べてみましたが、自分のユースケースでは swappiness を増やすか減らすかでどちらがよいのかがはっきりわかりませんでした。これによってパフォーマンスは向上するのでしょうか?

詳細: 私がトップを組み込んでいるマシンは、Ubuntu 14.04 を実行している Dell R900 です。16cat /proc/cpuinfo個の Intel(R) Xeon(R) CPU E7330 @ 2.40GHz プロセッサとcat /proc/meminfo16 Gb RAM を搭載しています。グループ内の他のマシンも同様で、同じ動作を示します。このエンコードはすべて DV ビデオから Mpeg2 ビデオへのエンコードですが、他の種類のビデオをエンコードすることもあります。これらのエンコードのソースは、上記のトップ投稿時点では何も書き込んでいないネットワーク RAID 上にあり、読み取り速度は 300+Mb/s です。宛先もネットワーク RAID で、それほど高速ではありませんが、結果として得られる MPEG データは入力データよりはるかに小さくなります。

答え1

まず、ハイエンド GPU はエンコードを桁違いに高速化します。通常、ハイエンド ビデオ カードはレンダリングを数時間から数分に短縮します。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. 

さらにCPUにもこれが必要です

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

    Possible values:

    ‘auto’

        autodetect a suitable number of threads to use 

関連情報