読者です 読者をやめる 読者になる 読者になる

プログラミングとかLinuxとかの備忘録

プログラミング、Linuxでハマった箇所や環境構築のメモ

KVM上でのエンコード速度の検証

Linux KVM

ホスト環境は

  • OS : CentOS7 (UEFIブート)
  • CPU: i7-6700K
  • M/B: ASRock Z170 Extreme6
  • RAM: Crucial CT4K8G4DFD8213 DDR4-2133 8GBx4

KVMのインストール

詳細はCentOS7へのKVMのインストール方法にあるためここではコマンド列挙のみにする
ホストへのKVMのインストール完了後にゲストにCentOS7をインストールする

$ sudo yum -y install qemu-kvm libvirt virt-install bridge-utils
$ sudo yum -y install spice-server

$ vi /etc/default/grub    # intel_iommu=onを追加
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos00/swap crashkernel=auto  vconsole.keymap=jp106 rd.lvm.lv=centos00/root vconsole.font=latarcyrheb-sun16 rhgb quiet intel_iommu=on"
GRUB_DISABLE_RECOVERY="true"

$ sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
$ sudo reboot

$ dmesg | grep -e DMAR -e IOMMU
[    0.000000] ACPI: DMAR 000000007f382ca0 000A8 (v01 INTEL      SKL  00000001 INTL 00000001)
[    0.000000] Intel-IOMMU: enabled
[    0.137271] dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 7e3ff0505e
[    0.137285] dmar: IOMMU 1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da
[    0.138559] IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    1.333512] DMAR: No ATSR found
[    1.333579] IOMMU 0 0xfed90000: using Queued invalidation
[    1.333582] IOMMU 1 0xfed91000: using Queued invalidation
[    1.333586] IOMMU: Setting RMRR:
[    1.333616] IOMMU: Setting identity map for device 0000:00:02.0 [0x7f800000 - 0x8fffffff]
[    1.333721] IOMMU: Setting identity map for device 0000:00:14.0 [0x7e958000 - 0x7e977fff]
[    1.333787] IOMMU: Prepare 0-16MiB unity mapping for LPC
[    1.333820] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]

$ sudo systemctl start libvirtd
$ sudo systemctl enable libvirtd


$ sudo systemctl stop NetworkManager
$ sudo systemctl disable NetworkManager
$ sudo systemctl start network
$ sudo chkconfig network on

$ cd /etc/sysconfig/network-scripts

$ sudo vi ifcfg-enp5s0
TYPE=Ethernet
DEVICE=enp5s0
ONBOOT=yes
BRIDGE=br0

$ sudo vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
IPV6INIT=no
UUID=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
ONBOOT=yes
DNS1=192.168.11.1
IPADDR=192.168.11.232
PREFIX=24
GATEWAY=192.168.11.1

$ sudo systemctl restart network


$ sudo virsh net-autostart default --disable
$ sudo virsh net-list --all
名前               状態     自動起動   永続
-----------------------------------------
default                   停止状態  いいえ (no)  はい (yes)

$ sudo systemctl stop firewalld

FFmpegのインストール

ホスト,ゲストにFFmpegをインストールする
(参考: CentOS7にyumでffmpegをインストール)

$ sudo yum -y install yum-plugin-priorities

$ sudo vi /etc/yum.repos.d/CentOS-Base.repo
# priority=1

$ sudo yum -y install epel-release
$ sudo vi /etc/yum.repos.d/epel.repo
# enabled=0,priority=11

$ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
$ sudo vi /etc/yum.repos.d/nux-dextop.repo
# enabled=0,priority=13

$ sudo yum -y --enablerepo=epel,nux-dextop install ffmpeg
$ ffmpeg -version
ffmpeg version 2.6.3 Copyright (c) 2000-2015 the FFmpeg developers

速度比較1

ホスト,ゲスト(6スレッド、16GB)で
以下のスクリプト(スレッド数:4)で30分のtsをエンコードした

time ffmpeg -y -i input.ts \
    -f mp4 \
    -preset medium -crf 20 -tune film \
    -vcodec libx264 -s 1280x720 -vf yadif \
    -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k \
    -threads 4 \
    output.mp4
  • ホスト(ゲスト起動状態): 16分16秒
  • ホスト(ゲスト停止状態): 16分15秒
  • ゲスト: 16分09秒

何故かゲストの方が早い結果になった...

速度比較2

ホスト、ゲスト(8スレッド、16GB)で
以下のスクリプト(スレッド数自動:12)で30分のtsをエンコードした

time ffmpeg -y -i input.ts \
    -f mp4 \
    -preset medium -crf 20 -tune film \
    -vcodec libx264 -s 1280x720 -vf yadif \
    -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k \
    -threads 0 \
    output.mp4
  • ホスト(ゲスト起動状態): 10分30秒
  • ホスト(ゲスト停止状態): 10分28秒
  • ゲスト: 11分21秒

消費電力

サンワサプライ TAP-TST8を用いて消費電力を測定した

  • アイドル: 23W
  • FFmpeg(スレッド数:4): 73W
  • FFmpeg(スレッド数:自動): 92W