Cấu hình Jellyfin NVIDIA hardware transcoding với Docker
Cấu hình GPU NVIDIA cho Jellyfin bằng Docker Compose, bật NVENC và NVDEC, rồi dùng nvidia-smi để xác nhận container thật sự đang transcoding.
Những gì bạn sẽ xây dựng
Transcoding bằng phần cứng của Jellyfin trên GPU NVIDIA gồm 4 bước theo một thứ tự cố định. Chỉ bước cuối cùng mới diễn ra bên trong Jellyfin. Container không thể thấy GPU nếu driver trên host chưa được nạp. Jellyfin không thể dùng GPU mà container không thấy. Thực hiện theo thứ tự này để mỗi lỗi đều có một vị trí rõ ràng cần kiểm tra.
- Cài driver NVIDIA trên host, sau đó xác nhận bằng
nvidia-smi. - Cài NVIDIA Container Toolkit để Docker có thể cấp GPU cho container.
- Dành GPU cho service Jellyfin trong
docker-compose.yml, sau đó xác nhận container thấy GPU. - Bật NVENC và NVDEC trong phần cài đặt playback của chính Jellyfin, sau đó xác nhận một phiên playback thực tế đang sử dụng chúng.
NVENC (NVIDIA encoder) và NVDEC (NVIDIA decoder) là các khối chức năng cố định trên card. Chúng là các mạch silicon riêng, tách khỏi các shader core dùng để chạy tác vụ CUDA (compute unified device architecture). Đây là lý do chính để thực hiện cấu hình này: một stream ngốn nhiều CPU core khi xử lý bằng software chỉ tiêu tốn một phần nhỏ của một core và một khối phần cứng chuyên dụng trên GPU.
Phát trực tiếp luôn tốt hơn transcode, vì vậy hãy kiểm tra việc này trước
Trước khi cấu hình bất kỳ thứ gì, hãy xác định xem bạn có đang transcode vì một nguyên nhân có thể loại bỏ đơn giản hay không. Jellyfin transcode khi client không thể phát file ở dạng hiện tại. Nguyên nhân gần như luôn thuộc một danh sách ngắn: codec video, codec âm thanh, định dạng container, phụ đề dạng hình ảnh, giới hạn bitrate do client yêu cầu, hoặc độ phân giải hay ràng buộc khác do client báo cáo.
Mở Dashboard, sau đó vào Playback, rồi theo dõi một session đang hoạt động trong khi phát nội dung. Session có trạng thái Direct playing gửi file nguyên trạng và gần như không dùng CPU. Session có trạng thái Transcoding hiển thị lý do Jellyfin chọn chế độ này. Loại bỏ lý do đó thì GPU hoàn toàn không cần chạy.
Hai thay đổi có thể loại bỏ phần lớn các lần transcode. Đặt chất lượng trong ứng dụng client thành Auto hoặc mức tối đa, vì client yêu cầu 4 Mbps sẽ buộc hệ thống encode lại file 20 Mbps bất kể file dùng codec nào. Sau đó dùng ứng dụng client native thay vì tab trình duyệt, vì trình duyệt là player bị giới hạn nhiều nhất trong các lựa chọn của bạn, còn ứng dụng native trên cùng TV thường có thể Direct play chính file đó.
Phụ đề dạng hình ảnh là trường hợp ngoại lệ mà không cài đặt nào trên client có thể khắc phục. Phụ đề PGS từ bản rip Blu-ray và VOBSUB từ bản rip DVD là hình ảnh, nên chúng phải được vẽ trực tiếp lên video. Điều này đồng nghĩa với việc encode lại toàn bộ video stream. Phụ đề dạng text trong SRT được gửi đến client dưới dạng track riêng và không tốn tài nguyên đáng kể. Nếu có thể, hãy chuyển các track phụ đề sang dạng text; việc này thường có giá trị hơn việc mua GPU. Phần còn lại về phía server được trình bày trong hướng dẫn chạy Jellyfin media server trên VPS.
Hầu hết gói VPS hoàn toàn không có GPU
Các gói VPS tiêu chuẩn không bao gồm GPU. Hãy chạy lệnh này trên server trước khi lên kế hoạch cho bất kỳ việc gì khác.
lspci -nn | grep -Ei "3d|display|vga"Trên một VPS KVM thông thường, lệnh này hiển thị bộ điều hợp màn hình ảo do hypervisor cung cấp hoặc không hiển thị thông tin hữu ích nào. Thiết bị đó không thể encode video. GPU thật chỉ xuất hiện khi nhà cung cấp passthrough một card vật lý vào instance của bạn hoặc cấp cho bạn một phần của card đó. Các gói này có giá tương ứng. Những workload nào thực sự đáng để trả tiền cho VPS có GPU giải thích những ai nên và không nên chọn loại VPS này.
Nếu không có GPU, hãy ưu tiên direct play và chỉ xem software transcoding là trường hợp hiếm. Một lần software transcode H.264 1080p cần nhiều tài nguyên nhưng vẫn có thể xử lý được trên vài CPU core. Software transcode 4K HDR có tone mapping không thể hoàn tất theo thời gian thực trên một VPS nhỏ. Vì vậy, stream sẽ bị giật trong khi CPU bị tải 100 percent.
Cài NVIDIA driver trên host
Jellyfin 10.11 yêu cầu NVIDIA driver tối thiểu là 520.56.06 trên Linux. Ubuntu có sẵn một helper để tự chọn package phù hợp.
sudo ubuntu-drivers list --gpgpu
sudo ubuntu-drivers install --gpgpu
sudo reboot--gpgpu chọn biến thể driver cho headless server. Đây là lựa chọn phù hợp cho media server vì máy không có desktop. Lệnh list hiển thị các branch có sẵn cho hệ thống. Bạn có thể pin một branch theo tên, ví dụ sudo ubuntu-drivers install --gpgpu nvidia:570-server. Hãy dùng branch thực sự xuất hiện trong kết quả list, không dùng branch được ghi trong ví dụ này.
Biến thể server không phải lúc nào cũng cài kèm nvidia-smi. Hãy cài package utils tương ứng với branch bạn đã chọn, ví dụ sudo apt install nvidia-utils-570-server. Sau đó kiểm tra driver.
nvidia-smiKết quả bình thường sẽ hiển thị một table có driver version và CUDA version ở phần header, tên card của bạn trong danh sách, còn process list thì trống. Có 2 lỗi thường gặp ở bước này. nvidia-smi: command not found có nghĩa là utils package bị thiếu, không phải driver bị thiếu. NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver có nghĩa là kernel module chưa được load. Với bản cài mới, nguyên nhân gần như luôn là bạn chưa reboot hoặc Secure Boot đang từ chối load module chưa được ký. Xác nhận module đã có bằng lsmod | grep nvidia.
Cài đặt NVIDIA Container Toolkit
Driver cho phép host sử dụng GPU. Docker vẫn không truyền GPU vào container vì container không có device node và thư viện driver. NVIDIA Container Toolkit là thành phần chèn cả hai thứ này khi container khởi động. Các lệnh dưới đây mengikuti hướng dẫn cài đặt chính thức của NVIDIA cho Debian và Ubuntu. Hướng dẫn hiện tại của NVIDIA cũng ghim các package của toolkit vào một release bằng một biến version; bỏ qua việc ghim như dưới đây sẽ cài release mới nhất trong repository.
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkitCài package là chưa đủ vì Docker phải được cấu hình để biết runtime này tồn tại.
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart dockernvidia-ctk runtime configure ghi một mục runtime nvidia vào /etc/docker/daemon.json. Restart là bước nhiều người bỏ qua nhất. Nếu bỏ qua, bạn thường gặp lỗi phổ biến nhất trong toàn bộ quy trình này. Hãy kiểm tra phần kết nối giữa Docker và GPU trước khi cấu hình Jellyfin.
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smiLệnh này phải in ra cùng bảng như bảng host đã in. Nếu thay vào đó lệnh báo lỗi không thể chọn device driver có gpu capabilities, Docker daemon chưa biết về nvidia runtime. Hãy chạy lại lệnh cấu hình rồi restart daemon.
Cấp GPU cho container Jellyfin trong Docker Compose
Đây là cú pháp Compose hiện đại. Cấu hình này dựa trên ví dụ do Jellyfin công bố và ghi rõ 2 biến môi trường NVIDIA.
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: 1000:1000
network_mode: host
restart: unless-stopped
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
volumes:
- /srv/jellyfin/config:/config
- /srv/jellyfin/cache:/cache
- /srv/media:/media:ro
runtime: nvidia
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]Khởi động container rồi kiểm tra trực tiếp từ bên trong.
docker compose up -d
docker compose exec jellyfin nvidia-smiNếu lệnh này in ra bảng driver từ bên trong container, GPU đã được chuyển tiếp đúng cách và mọi vấn đề còn lại đều nằm trong cấu hình Jellyfin.
4 dòng trong file đó cần được giải thích. capabilities: [gpu] là yêu cầu của chính Compose. Nếu bỏ dòng này, Compose sẽ từ chối service thay vì khởi động service mà không có GPU. NVIDIA_DRIVER_CAPABILITIES=all cũng quan trọng vì toolkit chỉ mount các thư viện video vào container khi capability video được yêu cầu. Khi biến này không được đặt, giá trị mặc định chỉ gồm utility và compute. Official Jellyfin image đã đặt biến này, nên trên image đó, dòng này giúp ngăn cấu hình khác ghi đè. Tài liệu Jellyfin nói rằng bạn phải tự thêm dòng này nếu tự build image. Nếu thiếu capability video, CUDA vẫn hoạt động nhưng NVDEC không hoạt động, và log transcode sẽ ghi Cannot load libnvcuvid.so.1. network_mode: host là cấu hình được dùng trong chính ví dụ NVIDIA của Jellyfin. Hướng dẫn container của Jellyfin nói rằng host networking là tùy chọn nhưng bắt buộc khi dùng DLNA. Nếu dùng bridge network, bạn phải tự publish cổng 8096/tcp và cổng auto-discovery 7359/udp.
user: 1000:1000 là dòng cuối cùng và không liên quan đến GPU. Dòng này quyết định Jellyfin được phép đọc những file nào trên media mount. Nếu giá trị không khớp, thư viện sẽ trống thay vì báo lỗi quyền truy cập. Cách PUID và PGID ánh xạ user trong container với các file trên đĩa giải thích cách đánh số. Đây cũng là cách đánh số bạn đã cấu hình nếu chạy stack Sonarr và Radarr trong Docker Compose bên cạnh stack này.
Vì sao hầu hết tutorial vẫn ghi runtime: nvidia
Dạng cũ xuất hiện trong gần như mọi hướng dẫn bạn tìm thấy và không sai. Đó là do lịch sử. Gói nvidia-docker2 ban đầu đăng ký một OCI runtime có tên nvidia, vì vậy cách duy nhất để đưa GPU vào container là dùng --runtime=nvidia cùng với NVIDIA_VISIBLE_DEVICES. Docker 19.03 bổ sung flag --gpus và API device request chính thức. Compose mất nhiều thời gian hơn mới hỗ trợ, và khi đã hỗ trợ, device request được đặt dưới deploy.resources.reservations.devices, một key mà hầu hết mọi người đã quen bỏ qua vì trước đây deploy có nghĩa là Docker Swarm.
Kết quả là hiện nay cả hai dạng đều hoạt động, và ví dụ được Jellyfin công bố dùng cả hai cùng lúc. Giữ runtime: nvidia không tốn gì và giúp file hoạt động trên các phiên bản Compose cũ hơn. Nếu chỉ giữ runtime: nvidia và bỏ block deploy, bạn phải giữ NVIDIA_VISIBLE_DEVICES=all, vì đường dẫn legacy đó đọc biến môi trường để quyết định các device nào cần inject và không có device request để đọc thay thế.
Bật hardware transcoding của NVIDIA trong Jellyfin
Các bước trước chưa yêu cầu Jellyfin sử dụng GPU. Vào Dashboard, chọn Playback, rồi chọn Transcoding. Đặt Hardware acceleration thành Nvidia NVENC. Chọn Enable hardware encoding. Nếu không, Jellyfin sẽ giải mã bằng GPU rồi mã hóa bằng CPU. Đây là trạng thái trung gian dễ gây nhầm lẫn: GPU có hoạt động nhưng CPU vẫn phải xử lý nặng.
Bật enhanced NVDEC decoder để chuyển giữa path NVDEC hiện tại và path CUVID cũ. Hãy để tùy chọn này bật. Xử lý Dolby Vision cần tùy chọn này để sử dụng NVDEC.
Trong mục Enable hardware decoding for, chỉ chọn các codec mà card thực sự hỗ trợ giải mã. Đây là setting thường bị cấu hình sai. Chọn AV1 trên card không có bộ giải mã AV1 sẽ không tạo ra thông báo lỗi. Jellyfin yêu cầu hardware decode nhưng không nhận được, sau đó chuyển sang giải mã bằng software. Kết quả là CPU sử dụng cao còn GPU gần như không hoạt động. Hiện tượng này trông giống hệt passthrough chưa hoạt động.
Có thêm một điều kiện áp dụng cho toàn bộ trang này: hardware acceleration chỉ được hỗ trợ đầy đủ với build jellyfin-ffmpeg đi kèm. Tài liệu Jellyfin cảnh báo rằng các binary FFmpeg từ nguồn khác sẽ chỉ cho phép acceleration một phần. Nếu bạn đã đặt đường dẫn FFmpeg trỏ đến system FFmpeg, hãy đổi lại.
GPU của bạn có thể decode và encode codec nào
Đây là các giới hạn Jellyfin ghi nhận cho NVENC và NVDEC. Decode và encode là hai khả năng riêng biệt. Một card có thể hỗ trợ một khả năng mà không hỗ trợ khả năng còn lại.
- H.264 8-bit: mọi NVIDIA GPU có cả NVENC và NVDEC đều decode và encode được codec này.
- HEVC 8-bit: decode và encode từ Maxwell thế hệ thứ hai (GM206) trở lên.
- HEVC 10-bit: decode từ Maxwell thế hệ thứ hai trở lên. Trong thế hệ này, chỉ các biến thể GM206 hỗ trợ tính năng đó. Encode chỉ được hỗ trợ từ Pascal trở lên.
- AV1: decode từ Ampere trở lên, ngoại trừ chip trung tâm dữ liệu GA100. Bảng decoder của NVIDIA cũng không liệt kê Hopper có hỗ trợ decode AV1. Encode từ Ada Lovelace trở lên; Jellyfin hỗ trợ tính năng này từ phiên bản 10.9.
Điểm khác biệt về HEVC 10-bit là vấn đề thường gây lỗi trong thực tế. Card Maxwell dùng GM206 decode file 4K HDR trên GPU nhưng không thể encode output 10-bit. Vì vậy, Jellyfin encode thành H.264 8-bit. Các chip Maxwell khác hoàn toàn không decode được HEVC 10-bit bằng phần cứng. Output H.264 8-bit này vẫn phát được và thường là lựa chọn phù hợp cho hầu hết client. Dù card của bạn hỗ trợ gì, encode AV1 hiếm khi là lựa chọn nên dùng trong 2026, vì client vẫn có hỗ trợ decode AV1 hạn chế. Transcode tồn tại để phát đến những client vốn đã gặp vấn đề khi phát nội dung đó.
Vì sao tone mapping âm thầm làm GPU quá tải trở lại
Tone mapping từ HDR (high dynamic range) sang SDR (standard dynamic range) là thiết lập làm tiêu tốn phần ngân sách GPU của bạn, và nguyên nhân nằm ở kiến trúc. Decode chạy trên NVDEC. Encode chạy trên NVENC. Tone mapping không chạy trên hai khối này: đây là một CUDA filter thực thi trên shader core, tức phần đa dụng của GPU dùng để chạy các tác vụ compute. Vì vậy, một luồng 4K HDR cần tone mapping sẽ sử dụng decoder và encoder, đồng thời tải thêm các shader.
Jellyfin ghi rõ CUDA tone mapping khả dụng trên mọi NVIDIA GPU có thể decode HEVC 10-bit. Điều đó có nghĩa là checkbox vẫn xuất hiện và vẫn hoạt động trên những card không thể duy trì tone mapping ở 4K. Triệu chứng là luồng bắt đầu phát, bị buffer rồi không bao giờ ổn định, trong khi nvidia-smi cho thấy encoder hầu như không bận.
Đây là lý do nên theo dõi riêng tải shader.
nvidia-smi dmon -s uLệnh này in một dòng mỗi giây, với các cột riêng cho sm, enc và dec. enc và dec thấp cùng với chỉ số sm cao cho thấy tải nằm ở shader thay vì các khối fixed-function. Khi đó, tone mapping, scaling hoặc subtitle burn-in là những nguyên nhân có khả năng nhất. Hãy xem đây là dấu hiệu định hướng, không phải bằng chứng chắc chắn: NVIDIA định nghĩa GPU utilisation là tỷ lệ của khoảng thời gian lấy mẫu mà trong đó có ít nhất một kernel đang thực thi. Vì vậy, chỉ số cao cho biết shader đang bận, không có nghĩa là chúng đã bị bão hòa. CUDA path cũng xử lý Dolby Vision profile 5 bằng zero copy. Điều này quan trọng vì nếu không có zero copy, frame phải được chuyển ra system memory rồi chuyển ngược lại giữa các bước filter, và vòng trao đổi đó tiêu tốn bandwidth trên từng frame.
Giới hạn session NVENC của GPU consumer thực sự giới hạn điều gì
Dữ liệu đằng sau biểu đồ này
[
{
"label": "GeForce RTX 5090",
"nvenc_engines": 3,
"max_encode_sessions": 12
},
{
"label": "GeForce RTX 4090",
"nvenc_engines": 2,
"max_encode_sessions": 12
},
{
"label": "GeForce RTX 4060",
"nvenc_engines": 1,
"max_encode_sessions": 12
}
]Đó là các số liệu trong matrix do NVIDIA công bố tính đến tháng 10 năm 2026, không phải số đo thực hiện ở đây. GeForce bị giới hạn ở 12 session encode đồng thời, bất kể model nào. Giới hạn này nằm trong driver chứ không nằm trong silicon. NVIDIA đã tăng giới hạn này nhiều lần trong những năm qua, vì vậy hãy xem matrix hiện tại thay vì dựa vào một thread cũ trên forum. Số lượng engine mới là yếu tố thực sự thay đổi theo từng card: GeForce RTX 5090 có 3 engine NVENC, còn GeForce RTX 4060 có 1. Nhiều engine hơn nghĩa là throughput encode song song cao hơn, không phải session ceiling cao hơn.
Giới hạn này đếm số session encode, nên chỉ đếm các stream transcoding. Direct play và remuxing không mở session encode. Các card data center như L4 được liệt kê là không giới hạn trong cùng matrix. GPU VPS thường được cung cấp bằng card data center, nên giới hạn này chủ yếu đáng quan tâm trên home server.
Khi chạm giới hạn, quá trình transcode sẽ fail và log FFmpeg sẽ có OpenEncodeSessionEx failed: out of memory (10). Thông báo nhắc đến memory, nhưng lỗi từ chối do chạm session limit cũng trả về cùng mã này. Vì vậy, hãy kiểm tra số stream đồng thời trước khi tìm nguyên nhân do rò rỉ VRAM. Trong thực tế, hầu hết người dùng chạm giới hạn tone mapping hoặc giới hạn upload bandwidth từ trước session thứ mười hai.
Chứng minh GPU đang transcoding, không chỉ dựa vào cấu hình
Một thiết lập đã lưu không phải là bằng chứng. Phát một file mà bạn biết chắc sẽ buộc phải transcode, sau đó thực hiện 3 bước kiểm tra.
- Mở Dashboard, rồi mở Playback. Session đang hoạt động phải hiển thị Transcoding và nêu lý do. Nếu hiển thị Direct playing, không có gì đang được transcode và bạn đang kiểm tra nhầm file.
- Mở Dashboard, rồi mở Logs và mở log
FFmpeg.Transcodemới nhất. Một lần hardware transcode đầy đủ sẽ hiển thị-hwaccel cudavà-hwaccel_output_format cudatrên command line, cùng với encoder NVENC nhưh264_nvenchoặchevc_nvenc, hoặc encoder AV1 NVENC trên Ada Lovelace và các thế hệ mới hơn. Nếu thấylibx264, quá trình encode đang chạy bằng software, bất kể trang cài đặt hiển thị gì. Nếu encoder là NVENC nhưng thiếu-hwaccel cuda, quá trình decode đang chạy bằng software. - Chạy
nvidia-smitrên host trong khi vẫn phát file. Một process từ/usr/lib/jellyfin-ffmpeg/ffmpegphải xuất hiện với GPU memory đã được cấp phát, vànvidia-smi dmon -s uphải hiển thị giá trị khác 0 ở các cột enc và dec.
Chạy bước kiểm tra thứ 3 trên host, không chạy bên trong container. nvidia-smi bên trong container thường hiển thị danh sách process trống vì container không thấy được process ID bên ngoài namespace của chính nó, trong khi các chỉ số utilisation vẫn hiển thị chính xác. Danh sách process trống bên trong container không phải là lỗi.
Khi hệ thống chuyển sang software mà không báo cho bạn
Jellyfin ưu tiên duy trì việc phát. Khi không có hardware path, nó chuyển sang software thay vì làm stream thất bại. Vì vậy, dấu hiệu chính xác là mức tải CPU và log của FFmpeg, không phải banner lỗi.
Cannot load libnvcuvid.so.1 trong transcode log có nghĩa là decoder library chưa bao giờ được mount vào container. Đặt NVIDIA_DRIVER_CAPABILITIES=all rồi recreate container, vì thay đổi environment cần docker compose up -d để build lại container. Restart thông thường vẫn giữ các thiết lập cũ.
No capable devices found từ h264_nvenc có nghĩa là FFmpeg đã truy cập được encoder library nhưng không tìm thấy card nào có thể sử dụng. Kiểm tra lại docker compose exec jellyfin nvidia-smi, vì nguyên nhân thường là device reservation đã bị gỡ hoặc container được recreate từ một file cũ.
CPU cao trong khi GPU gần như không hoạt động thường có nghĩa là phía decode đang âm thầm thất bại. Bỏ chọn các codec mà thế hệ hardware của bạn không decode được, sau đó phát lại cùng file và đọc lại FFmpeg log để xem -hwaccel cuda có xuất hiện không. Nếu có và CPU vẫn bận, hãy tìm một stage mà Jellyfin không thể đưa lên GPU, chẳng hạn image subtitle burn-in.
Một transcode khởi động rồi bị treo khi phát 4K HDR trong khi 1080p vẫn hoạt động thường là giới hạn của tone mapping, không phải lỗi cài đặt. Theo dõi cột sm trong nvidia-smi dmon -s u, rồi phát lại cùng file khi đã tắt tone mapping. Nếu stream ổn định, tone mapping là giới hạn. Khi đó, hãy giảm resolution mà client yêu cầu hoặc chỉ giữ file 4K HDR trên các client có thể direct play chúng.
FAQ
Jellyfin vẫn sử dụng CPU sau khi tôi bật NVENC, vì sao?
Kiểm tra log FFmpeg.Transcode mới nhất trong Dashboard, rồi chọn Logs. Nếu log hiển thị libx264, quá trình encode đang chạy bằng software. Nếu -hwaccel cuda cũng không xuất hiện, không có hardware path nào được sử dụng. Nguyên nhân thường là container không nhìn thấy GPU, vì vậy hãy chạy docker compose exec jellyfin nvidia-smi để xác nhận. Nếu -hwaccel cuda xuất hiện cùng với libx264, quá trình decode đã chạy trên GPU nhưng tùy chọn Enable hardware encoding vẫn đang tắt. Nếu log hiển thị h264_nvenc mà không có -hwaccel cuda, phía decode đang chạy bằng software. Điều này xảy ra khi codec của file chưa được chọn trong Enable hardware decoding for, hoặc khi bạn chọn một codec mà card không hỗ trợ decode. Nếu cả hai đều xuất hiện mà CPU vẫn bận, tải xử lý đến từ một giai đoạn vẫn chạy trên CPU, chẳng hạn như burn-in phụ đề.
Tôi có còn cần dòng runtime: nvidia trong Docker Compose không?
Không, nếu bạn đã có block deploy.resources.reservations.devices và đang dùng Docker Compose hiện tại. Đây là dạng yêu cầu device hiện đại và thực hiện cùng chức năng. runtime: nvidia là cách cũ từ thời nvidia-docker2. Cách này vẫn hoạt động, và ví dụ được Jellyfin công bố vẫn giữ cả hai. Giữ cả hai không gây hại. Nếu chỉ giữ runtime: nvidia, bạn cũng phải giữ NVIDIA_VISIBLE_DEVICES=all, vì cách này không có device request để đọc danh sách thiết bị mà lấy danh sách đó từ environment.
Một NVIDIA GPU có thể transcode bao nhiêu stream cùng lúc?
Theo ma trận được NVIDIA công bố, GeForce bị giới hạn ở 12 phiên encode đồng thời tính đến tháng 10 năm 2026, còn các card trung tâm dữ liệu được liệt kê là không giới hạn. Giới hạn này hiếm khi là yếu tố làm hệ thống dừng lại. Tone mapping từ HDR sang SDR chạy trên shader core thay vì NVENC, vì vậy một số stream 4K HDR có thể làm cạn shader trước khi số phiên encode trở thành vấn đề. Hãy đo trường hợp thực tế bằng nvidia-smi dmon -s u và theo dõi cột sm, không phải số phiên.
Tôi có thể dùng hardware transcoding trên VPS không có GPU không?
Không. Việc encode cần block NVENC vật lý, còn lspci -nn | grep -Ei "3d|display|vga" trên VPS tiêu chuẩn chỉ hiển thị virtual display adapter do hypervisor cung cấp. Cách xử lý thực tế trên gói không có GPU là loại bỏ nhu cầu transcode: tăng chất lượng của client lên Auto, dùng ứng dụng client native thay vì browser, và chuyển các track phụ đề dạng ảnh sang dạng text để chúng không buộc video phải re-encode.
Vì sao 4K HDR bị giật trong khi 1080p transcode vẫn bình thường?
Hai workload sử dụng các thành phần khác nhau của card. 1080p SDR transcode chủ yếu gồm decode và encode. Cả hai đều chạy trên hardware chuyên dụng khi card hỗ trợ codec, cùng với scaling, deinterlacing hoặc burn-in phụ đề mà stream yêu cầu. Stream 4K HDR bổ sung tone mapping, là một CUDA filter chạy trên shader core, cùng với một frame lớn hơn nhiều cần được scale. Nếu nvidia-smi dmon -s u hiển thị enc và dec thấp nhưng sm cao, đó là dấu hiệu của trường hợp này. Các block hardware chuyên dụng chỉ chịu tải nhẹ trong khi shader đang bận. Hãy phát lại file với tone mapping bị tắt để xác nhận.