Chuyên mục
Virtualization

Cấu hình iGPU Passthrough cho LXC và kích hoạt HW Transcode trên Plex

Sau khi cài đặt Plex lên máy ảo LXC (Linux Container), mình nghiên cứu tiếp đến cách cấu hình Hardware Transcoding cho Plex để giảm tải cho CPU máy chủ.

Mặc định, Plex sẽ sử dụng tài nguyên CPU cho tác vụ chuyển mã (Transcode) phim mỗi khi thiết bị phát không hỗ trợ mở trực tiếp (Direct Play) từ server. Việc này sẽ gây ảnh hưởng đến hiệu năng hoạt động của các máy ảo khác trong cùng hệ thống.

Nếu máy tính được trang bị GPU rời hay iGPU (đồ hoạ tích hợp trên CPU Intel), chúng ta có thể cấu hình cho Plex sử dụng tính năng Hardware Acceleration để transcode phim bằng card màn hình để giảm tải cho CPU.

Trong bài viết này, mình sẽ hướng dẫn cách cấu hình cho phép LXC Container sử dụng iGPU tích hợp trên CPU Intel để Plex tận dụng tính năng Quick Sync cho việc transcode phim.

Yêu cầu chuẩn bị

  • Máy chủ trang bị CPU Intel đời Sandy Bridge (2011) trở về sau.
  • Máy ảo LXC Container đã được cài đặt sẵn Plex Media Server.
  • Tài khoản Plex Pass: để có thể sử dụng tính năng Hardward Transcoding trên Plex

Điều chỉnh thông số LXC

Mặc định Proxmox không cho phép LXC Container truy cập vào GPU của hệ thống. Chúng ta có thể kiểm tra bằng cách sử dụng lệnh vainfo

Cài đặt vainfo trong LXC

sudo apt install vainfo

Gõ lệnh vainfo, hệ thống sẽ phản hồi lỗi error như dưới đây

root@plex:~# vainfo
error: can't connect to X server!
error: failed to initialize display

Trong khi đó, nếu chạy lệnh vainfo trực tiếp trên Proxmox host, kết quả trả về như sau

root@proxmox:~# vainfo
error: can't connect to X server!
libva info: VA-API version 1.10.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: va_openDriver() returns -1
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_8
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.10 (libva 2.10.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 2.4.1
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264ConstrainedBaseline: VAEntrypointFEI
      VAProfileH264ConstrainedBaseline: VAEntrypointStats
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointFEI
      VAProfileH264Main               : VAEntrypointStats
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointFEI
      VAProfileH264High               : VAEntrypointStats
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointVLD

Để LXC có quyền truy cập vào iGPU, mình sẽ chỉnh sửa lại file cấu hình của LXC

Truy cập vào Terminal của Proxmox host và gõ lệnh sau

nano /etc/pve/lxc/<container id>.conf

Bạn cần thay thế bằng id tương ứng của LXC đang cài Plex. Xem id trong giao diện quản lý Web của Proxmox.

Nội dung của file sẽ tương tự như sau

arch: amd64
cmode: shell
cores: 1
features: nesting=1
hostname: plex
memory: 1024
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.0.1,hwaddr=E2:63:4F:3F:04:AC,ip=192.168.0.60/24,type=veth
onboot: 1
ostype: ubuntu
rootfs: local-lvm:vm-103-disk-0,size=8G
swap: 1024
unprivileged: 1

Thay thế thông số unprivileged từ 1 thành 0

Thêm các dòng sau vào dưới cùng

Áp dụng cho Proxmox 7.0 về sau

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file

Áp dụng cho Proxmox 6.4 hoặc cũ hơn

lxc.cgroup.devices.allow: c 226:0 rwm
lxc.cgroup.devices.allow: c 226:128 rwm
lxc.cgroup.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file

Toàn bộ nội dung sau khi chỉnh sửa sẽ như sau

arch: amd64
cmode: shell
cores: 1
features: nesting=1
hostname: plex
memory: 1024
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.0.1,hwaddr=E2:63:4F:3F:04:AC,ip=192.168.0.60/24,type=veth
onboot: 1
ostype: ubuntu
rootfs: local-lvm:vm-103-disk-0,size=8G
swap: 1024
unprivileged: 0
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file

Lưu lại và thoát ra.

Tiếp theo, mình sẽ truy cập vào LXC Container để tắt nó đi. Sau đó khởi động lại để các thay đổi cấu hình vừa chỉnh ở trên được áp dụng.

Tắt LXC Container (gõ trong Terminal của LXC)

sudo shutdown now

Mở LXC Container (gõ trong Terminal của Proxmox)

pct start 105

Trong đó 105 là id của LXC Container. Hoặc bạn có thể sử dụng giao diện Web UI của Proxmox để khởi động LXC.

Kiểm tra LXC có truy cập GPU chưa?

Sau khi LXC Container khởi động lại, mình sẽ truy cập vào Terminal của nó và kiểm tra lại lệnh vainfo

root@plex:~# vainfo
error: can't connect to X server!
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointVLD

Kết quả trả về giờ đã hiển thị các thông tin liên quan đến Intel iHD driver, cho thấy LXC đã có quyền truy cập vào GPU tích hợp trên CPU Intel để sử dụng tính năng Quick Sync khi Transcode.

Cấu hình Transcoder trên Plex

Truy cập vào phần cấu hình trên Plex: Plex —> Settings —> Transcoder và bấm chọn hai mục [x]  Use hardware acceleration when available và [x]  Use hardware-accelerated video encoding

Bấm Save Changes để lưu lại.

Lưu ý: 2 mục này chỉ xuất hiện nếu bạn đang sử dùng tài khoản Plex Pass trả phí. Còn sử dụng Plex miễn phí thì sẽ không thể kích hoạt tính năng Hardward Transcoding.

Kiểm tra Transcoder có sử dụng iGPU?

Để kiểm tra xem Plex có tận dụng tính năng Quick Sync trên Intel GPU cho tác vụ Transcoder không, mình sẽ mở 1 phim trên iPhone và truy cập vào mục Playback Settings → Quality → Chọn Convert to 1080p HD (High) để ép Plex thực hiện Transcoding thay vì Streaming trực tiếp.

Truy cập vào Plex Dashboard, nếu thấy xuất hiện chữ Transcode (hw) ở dòng Video nghĩa là Plex đang sử dụng tính năng Quick Sync của iGPU để chuyển mã phim

Kiểm tra CPU trên Proxmox, sẽ thấy CPU chạy nhẹ nhàng, không bị full load 90-100% như trước khi cấu hình chuyển mã bằng iGPU.

Vậy là yên tâm xem phim thoải mái. Không lo Proxmox bị sập vì CPU quá tải.

Chúc bạn thực hiện thành công!