ProxmoxでのiGPUパススルー設定:メディアトランスコード時のCPU負荷を劇的に軽減

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

課題:動画視聴時になぜCPU負荷が急上昇するのか?

PlexやJellyfinで4K映画を視聴する際、CPU使用率が100%に達するのはホームラボ愛好家にとって珍しいことではありません。筆者も以前、12個のVMを稼働させている環境で、家族がHEVCの動画を再生するたびに、Webサービスや他のプロダクション環境にラグが発生するという経験をしました。CPUが動画のデコード(ソフトウェアトランスコーディング)をすべて担うのは、リソースの莫大な無駄遣いです。事前にCPUやディスクのパフォーマンスを正確に測定しておくと、こうしたボトルネックを特定しやすくなります。

解決策は、使用しているIntelチップの中にあります。現在のほとんどのIntel CPUには、**Intel QuickSync**技術を搭載したグラフィックスコア(iGPU)が内蔵されています。このiGPUをVMやLXCに「パススルー」することで、i5-10500でのCPU負荷を95%から5%未満にまで削減できました。動画はスムーズに再生され、サーバーも低温に保たれます。

QuickSyncとパススルー:正しく理解して設定する

コマンドを入力する前に、適切な方法を選択するためにこれら2つの仕組みを区別しておきましょう。

  • Intel QuickSync: 動画専用のハードウェアアクセラレータです。CPUよりも何倍も高速で省電力に処理を行います.
  • LXC Passthrough: ホストからコンテナへiGPUを共有する方法です。最大の利点は、1つのiGPUを複数のLXC(例:PlexとHandbrake)で同時に共有できることです。
  • VM Passthrough (PCI Passthrough): iGPUを特定の仮想マシンにのみ割り当てます。割り当てられると、Proxmoxホストや他のVMからはそのデバイスが完全に見えなくなります。

実体験からのアドバイス:**LXC**を優先してください。軽量でリソース消費が少なく、パススルーの設定もVMに比べてはるかに簡単です。

第1部:Proxmoxホスト側の確認

まずはProxmoxが「武器」を認識しているか確認しましょう。Proxmox VEの最適化が済んでいることを前提に、コンソールにアクセスして以下を入力します。

ls -l /dev/dri

card0renderD128が表示されましたか?それならハードウェアの準備は万端です。何も表示されない場合は、BIOSに入り、Internal GraphicsがAutoではなく**Enabled**になっていることを確認してください。

今後のパフォーマンス監視のために、以下のツールをインストールしておきましょう。

apt update && apt install intel-gpu-tools -y

intel_gpu_topコマンドは、iGPUが実際に動作しているかどうかを確認するための「監視の目」になります。

第2部:LXCでのiGPU設定(推奨される方法)

JellyfinコンテナのIDが101であると仮定して、グラフィックスデバイスへのアクセス権限を割り当てます。

ステップ1:ドライバーのグループIDを確認する

ホスト上で以下のコマンドを実行します。

ls -n /dev/dri/renderD128

結果はcrw-rw---- 1 0 104 ...のようになります。**104**という数字(環境によっては44や105の場合もあります)をメモしておいてください。これが権限設定の鍵となります。

ステップ2:LXC設定ファイルの編集

以下のコマンドで設定ファイルを開きます。

nano /etc/pve/lxc/101.conf

ファイルの末尾に以下のコードを貼り付けます。104の部分は先ほど確認したIDに置き換えてください。

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.idmap: u 0 100000 65536
lxc.idmap: g 0 100000 104
lxc.idmap: g 104 104 1
lxc.idmap: g 105 100105 65431

これらのidmap行は非常に重要です。これにより、LXC内のユーザーがホストからドライバーを「借りて」グラフィックス処理を行うことが可能になります。

ステップ3:LXC内でのドライバーインストール

LXCを起動し、そのコンソールに入って実行環境をインストールします。

apt update && apt install va-driver-all-dev mesa-va-drivers -y

LXC内で再度ls -l /dev/driを確認してください。デバイスが表示されれば、90%は完了です。

第3部:VMでの設定(フルPCIパススルー)

Windows Media Serverを実行する場合、この方法が必要です。あらかじめWindows VMの構築を済ませておくとスムーズです。このプロセスでは、ProxmoxホストがiGPUを仮想マシンのために完全に「犠牲」にする必要があります。

ステップ1:IOMMUの有効化

ハードウェアインターフェースを開放するためにGRUBファイルを編集します。

nano /etc/default/grub

設定行を以下のように更新します。

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

その後、update-grubを実行してサーバーを再起動します。

ステップ2:ホスト側でのドライバーのブラックリスト化

VMがiGPUを占有できるように、Proxmoxホストがそれに触れないようにする必要があります。ドライバーをブラックリストに追加します。

echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
update-initramfs -u -k all

ステップ3:Web UI経由でのデバイス割り当て

Proxmox Web UIにアクセスし、対象のVMを選択 -> Hardware -> Add -> PCI Device をクリックします。0000:00:02.0(通常はiGPU)という名前のデバイスを探します。これはGPUパススルーの設定と同様の手順です。補助コンポーネントをすべて認識させるために、All Functionsにチェックを入れるのを忘れないでください。

成果の確認:CPUだけを見ないこと

QuickSyncが実際に「チームを支えている」かどうかを知るには、ホストのコンソールでintel_gpu_topを実行してください。より詳細な統計が必要な場合は、仮想マシンの監視環境を構築してダッシュボード化するのも良いでしょう。次に、Jellyfinで4K映画を再生し、720p 4Mbpsへのトランスコードを強制します。

監視画面のVideoカラムの数値が上がれば(例:15-30%)、iGPUは完璧に動作しています。この時、CPUは非常に余裕があり、通常は数%程度の変動にとどまります。

Jellyfinユーザーへのヒント:Dashboard -> Playbackに移動し、Hardware acceleration: Intel QuickSync (QSV)を選択するのを忘れないでください。ハードウェアが処理すべき内容を認識できるように、H264やHEVCなどのコーデックにチェックを入れてください。

結論

iGPUパススルーの設定は、ホームラボを運用するすべての人にとって「価格以上の価値がある」アップグレードです。動作がスムーズになるだけでなく、過熱による負荷が減るため、ハードウェアの寿命も延びます. もし “Permission denied” エラーが発生した場合は、LXCのidmapステップを再確認してください。そこが失敗の8割を占めるポイントです。

Share: