virtio-nvgpu: Đưa GPU NVIDIA vào máy ảo KVM với hiệu năng gần như chạy trực tiếp

Công nghệ24 tháng 9, 2026·6 phút đọc

Dự án virtio-nvgpu của nestrilabs cho phép máy ảo KVM truy cập GPU NVIDIA gần như native bằng cách chuyển tiếp ioctl ở cấp driver kernel thay vì dịch API. Hiệu năng đạt trong khoảng 2% so với chạy trực tiếp trên phần cứng, với chi phí CPU tương đương, và có thể chia sẻ một card cho nhiều máy ảo.

virtio-nvgpu: Đưa GPU NVIDIA vào máy ảo KVM với hiệu năng gần như chạy trực tiếp

Một dự án mã nguồn mở mới mang tên virtio-nvgpu đang thu hút sự chú ý trong cộng đồng ảo hóa khi chứng minh rằng máy ảo KVM có thể truy cập GPU NVIDIA với hiệu năng gần như chạy trực tiếp trên phần cứng. Thay vì dịch ở cấp API đồ họa, giải pháp này chuyển tiếp các lệnh ioctl của driver kernel NVIDIA giữa máy ảo Linux và máy chủ.

Điểm đáng chú ý là máy ảo chạy nguyên bản các thư viện user-mode của NVIDIA — cùng thư viện, cùng Vulkan và NVENC — nói chuyện trực tiếp với card đồ họa thật. Mục tiêu hướng tới là truyền phát không màn hình (headless streaming): một compositor bên trong máy ảo render, tổng hợp và mã hóa khung hình trên GPU, sau đó gửi video nén ra ngoài qua mạng.

Hiệu năng đo được

Theo kết quả đo trên RTX 3060 (driver 595.99.02), khi so sánh máy ảo với chính máy chủ đó chạy bare metal dưới cùng một tải Vulkan headless, thời gian xử lý mỗi khung hình của máy ảo chỉ chênh lệch trong khoảng 2% so với chạy trực tiếp.

Trên ngưỡng khoảng 2 ms mỗi khung hình — tức là mọi khung hình mà game vẽ ra — máy ảo nằm trong khoảng 2% so với bare metal.

Ở các khung hình rất nhẹ (dưới 0,5 ms), chi phí chờ đợi GPU bắt đầu lộ rõ, nhưng đây là trường hợp hiếm gặp trong thực tế.

Chi phí CPU cũng gần như tương đương: trong một thử nghiệm chạy không giới hạn tốc độ ở khoảng 100 fps trong 12 giây, máy chủ bare metal dùng 0,40 giây CPU còn máy ảo dùng 0,37 giây. Điều này là nhờ trong vòng lặp render hầu như không có gì được chuyển tiếp: driver user-mode của NVIDIA ghi lệnh qua vùng nhớ mà nó đã ánh xạ, và vùng nhớ đó chính là của máy chủ. Thống kê cho thấy trên 813.691 khung hình, backend chỉ phục vụ 13.792 thông điệp — tức khoảng một lần vượt ranh giới máy ảo cho mỗi 59 khung hình, gần như toàn bộ là thiết lập thiết bị ban đầu.

Chia sẻ một card cho nhiều máy ảo

Một trong những điểm mạnh của virtio-nvgpu là khả năng chia sẻ GPU giữa nhiều máy ảo. Thử nghiệm với bốn máy ảo trên cùng một RTX 3060 cho kết quả 25,84 / 26,49 / 25,57 / 25,79 fps, tổng cộng 103,7 fps so với 102,9 fps khi chỉ chạy một máy ảo. Thời gian khung hình p50 gần như giống hệt nhau ở mức 39,165 ms.

Cả bốn máy ảo đều render chính xác cùng lúc và mã hóa H.264 đồng thời, mỗi cái ở đúng 60 Hz mà không chạm giới hạn phiên NVENC. Dự án lưu ý rằng bốn là con số đã chạy thử, không phải giới hạn tìm được — tám máy ảo vẫn chưa được kiểm nghiệm.

Vấn đề với các hướng tiếp cận hiện có

Dự án chỉ ra ba hạn chế chính của các phương pháp truyền thống:

  • virtio-gpu + Venus dịch ở cấp API: mỗi lệnh Vulkan hay OpenGL đều bị tuần tự hóa, vận chuyển qua virtio rồi phát lại ở máy chủ. Với game phát 1.000 đến 5.000 draw call mỗi khung hình, độ trễ và chi phí CPU tăng đáng kể. Quan trọng hơn, mã hóa phía máy ảo không khả thi vì buffer GPU thuộc sở hữu máy chủ.
  • DRM native context (Intel/AMD): máy ảo chạy driver Mesa thật và chỉ gửi lệnh đi, nhưng giải pháp này chưa tồn tại cho NVIDIA.
  • VFIO passthrough: hiệu năng native nhưng dành trọn GPU cho một máy ảo, không phù hợp môi trường đa người thuê.

virtio-nvgpu khác biệt ở chỗ dịch tại cấp driver kernel thay vì cấp API đồ họa. Số lần vượt ranh giới máy ảo mỗi khung hình chỉ khoảng 0,02 lần, so với hàng nghìn lần của Venus.

Kiến trúc và giấy phép

Repository được chia thành bốn thành phần với ba vùng giấy phép riêng biệt, một cách bố trí có chủ đích:

  • driver/ (GPL-2.0): module kernel phía máy ảo, đăng ký các thiết bị /dev/nvidia* và chuyển tiếp ioctl qua virtqueue.
  • device/ (Apache-2.0): thiết bị virtio viết bằng Rust, không phụ thuộc vào bất kỳ VMM cụ thể nào.
  • protocol/ (BSD-3-Clause hoặc GPL-2.0+): định dạng đường truyền và định nghĩa ABI dùng chung, cấp phép kép để cả driver GPL lẫn crate Apache đều có thể dùng chung header.
  • gen/: bảng ABI được sinh tự động, có thể tái tạo.

Đáng chú ý, phần isolate/ hiện mới chỉ là bản thiết kế chứ chưa có code. Kế hoạch là mỗi tiến trình máy ảo sẽ có một tiến trình trợ giúp được sandbox, giữ các file descriptor thiết bị thật và thực hiện lệnh ioctl không đặc quyền. Hiện tại backend vẫn tự đảm nhiệm việc này ngay trong tiến trình của VMM.

Phạm vi hỗ trợ

Dự án hỗ trợ render Vulkan (bao gồm trình bày lên compositor trong máy ảo), render OpenGL headless qua EGL, cấp phát bộ nhớ thiết bị CUDA, tương tác CUDA với Vulkan/GL không sao chép, cùng mã hóa NVENC và giải mã NVDEC.

Nằm ngoài phạm vi gồm: cudaMallocManaged() và bộ nhớ ảo hợp nhất đầy đủ, đầu ra màn hình vật lý (scanout), MIG, SR-IOV, và các phiên bản driver NVIDIA tùy ý.

Phiên bản driver

ABI driver kernel của NVIDIA không ổn định — bố cục struct ioctl thay đổi giữa các bản phát hành. Dự án hỗ trợ tường minh theo các profile:

  • 535.129.03
  • 580.178.04
  • 595.71.05 trở lên

Các profile hoạt động theo khoảng chứ không theo điểm cụ thể. Bất kỳ bản nào cũ hơn 535.129.03 đều bị từ chối thay vì đoán mò, vì chuyển tiếp một ioctl có bố cục chưa từng thấy có thể dẫn đến kết quả sai mà không báo lỗi.

Ý nghĩa với người dùng Việt Nam

Với các nhà phát triển và doanh nghiệp Việt Nam đang xây dựng hạ tầng cloud gaming, render farm hoặc dịch vụ AI trên nền tảng ảo hóa, virtio-nvgpu mở ra một hướng tiếp cận hấp dẫn: chia sẻ GPU đắt tiền giữa nhiều máy ảo mà không đánh đổi nhiều về hiệu năng. Đây là bài toán đặc biệt có ý nghĩa khi chi phí GPU vẫn là gánh nặng lớn với các startup công nghệ trong nước.

Tuy nhiên, dự án vẫn đang ở giai đoạn sớm: phần isolate chưa hoàn thiện, chưa thử nghiệm với hơn bốn máy ảo, và mới chỉ kiểm chứng kỹ lưỡng trên một cấu hình card duy nhất. Những ai muốn tìm hiểu sâu có thể tham khảo BENCHMARKS.mdARCHITECTURE.md trong repository để nắm phương pháp đo và các giới hạn của thiết kế.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗