TECHLOGICS

HYLOGICS分室。作業メモやガジェットのレビューなど、主に技術系のエントリを取り扱います。

【Linux】ffmpegによるエンコード処理でマルチスレッドとCPUアフィニティの実験

環境

HW

SW

  • CentOS6(kernel 3.18.25)
  • ffmpeg 2.8.2

背景

ホスト上で全力でエンコードを回しているとVM(特にWindows)がスローダウンしたり、X Window上での作業に影響が出るため

  • どの程度スレッドを割り振れば良いのか
  • エンコード処理を動かすコアを指定できないか

を検証しようと思いました。

ちなみにffmpegのビルドについては以前書いてます。

Linuxで動画をエンコードするためにffmpegを導入する - HYLOGICS

所感

結論

  1. スレッド数を増やしたりディスクI/Oを改善してもエンコード速度はそんなに速くならない(スレッド数1 -> 4で速度は1.5倍、1 -> 12で速度は2倍)
  2. CPUアフィニティの設定はプロセス稼働後にtasksetで動的に指定する(プロセス起動時には指定する方法はわからなかった)
  3. シングルスレッドであればCPUアフィニティを指定してVMとは別のコア/スレッドでプロセスを動かすことが可能
  4. マルチスレッドだとCPUアフィニティの設定を無視して動くため、VM(特にWindows)への影響がある

ということを踏まえて、恐らく性能と負荷のバランス的には4〜12の間でスレッドを指定すれば良いと判断。とりあえずホスト上で8スレッドで回してみたところ、この程度であればエンコード速度も殆ど劣化せず、VMへの負荷も少ないため動画を観たりしても余裕な感じなので暫くこのまま運用しようと思います。