
virtio-nvgpu: NVIDIA-ს GPU-ზე თითქმის ბუნებრივი წვდომა KVM-ის guest-ში
Nestri-ს გუნდმა ექსპერიმენტული virtio-nvgpu გამოაქვეყნა. მოწყობილობა NVIDIA-ს დრაივერის ioctl-ებს driver ABI-ს დონეზე გადასცემს, ამიტომ KVM-ის guest-ში ბარათი თითქმის ისე მუშაობს, როგორც ვირტუალიზაციის გარეშე, NVENC-ის კოდირების ჩათვლით.
Nestri-ს გუნდმა, რომელიც ღია კოდის ღრუბლოვანი გეიმინგის სტეკს nesbox-ს ავითარებს, ექსპერიმენტული პროექტი virtio-nvgpu გამოაქვეყნა. ეს virtio მოწყობილობა KVM-ის ვირტუალურ მანქანას NVIDIA-ს ვიდეობარათზე თითქმის ბუნებრივ წვდომას აძლევს: გრაფიკული API-ს გამოძახებების თარგმნის ნაცვლად ის NVIDIA-ს kernel დრაივერის ioctl-ებს guest-სა და host-ს შორის driver ABI-ს დონეზე გადასცემს. ამიტომ guest-ში NVIDIA-ს საკუთარი user-mode დრაივერები უცვლელად მუშაობს და იგივე Vulkan და NVENC იმავე ბარათს ესაუბრება.
სამიზნე headless სტრიმინგია: ვირტუალურ მანქანაში კომპოზიტორი კადრებს GPU-ზე ხატავს, აწყობს და კოდირებს, გარეთ კი მხოლოდ შეკუმშული ვიდეო გადის. მონიტორი არ არსებობს, ბარათი host-ს რჩება.
როგორ მუშაობს
guest-ის მოდული /dev/nvidiactl, /dev/nvidia-uvm და /dev/nvidia0-დან /dev/nvidiaN-მდე მოწყობილობებს არეგისტრირებს. ყოველი ioctl virtqueue-ზე გადის, VMM-ში ABI-ს მცოდნე კომპონენტი მას host-ის მოწყობილობებისთვის თარგმნის, mmap კი საერთო მეხსიერების ფანჯარას აკავშირებს. საპირისპირო რიგი guest-ს ატყობინებს, როდის არის GPU მზად; სწორედ ამიტომ შეუძლია მას ლოდინის დროს დაიძინოს და CPU ტყუილად არ დატვირთოს.
guest-ის user-mode დრაივერი ბრძანებების ბუფერებს ლოკალურად აწყობს, ამიტომ ცალკეული draw call-ები საზღვარს არასდროს კვეთს. პროექტის აღრიცხვით, ერთ სრულ სერიაზე guest-მა 813 691 კადრი დახატა, backend-მა კი მხოლოდ 13 792 შეტყობინება დაამუშავა, ანუ დაახლოებით ერთი გადაკვეთა 59 კადრზე.
შედეგები
ამოზომვა RTX 3060-ზე, 595.99.02 დრაივერით ჩატარდა: host-ზე Ubuntu 26.04 და Ryzen 7 9850X3D, guest-ში 2 vCPU და Linux 7.2. ორ მილიწამზე მძიმე კადრებზე სხვაობა იმავე მანქანაზე ვირტუალიზაციის გარეშე გაშვებულ სისტემასთან 2%-ს არ აღემატება: 39 მილიწამიანი კადრი guest-ში 0,4%-ით უფრო სწრაფი იყო, 2 მილიწამიანი კი 1,7%-ით ნელი. მსუბუქ კადრებზე სხვაობა იზრდება (0,5 მილიწამზე 7,1%), რადგან გამოღვიძება დაახლოებით 0,02 მილიწამი ღირს.
CPU-ს ხარჯი იმავე დონეზეა: 12 წამში, წამში დაახლოებით 100 კადრით, guest-მა 0,37 წამი დახარჯა, host-მა 0,40. ოთხი guest ერთ ბარათს თანაბრად იყოფს: ერთად 103,7 კადრი წამში, ერთი guest კი 102,9-ს აღწევს. ოთხივე პარალელურად კოდირებს H.264 ვიდეოს სტაბილურ 60 Hz-ზე.
რაც ჯერ არ არის
ავტორები უსაფრთხოების საკითხზე ღიად წერენ: guest-ის GPU სამუშაოსა და host-ს შორის IOMMU-ს საზღვარი არ არსებობს, ბარათი host-ის დრაივერის დომენში რჩება, host-ის NVIDIA დრაივერი კი სანდო კომპონენტად რჩება. ABI პროფილში აღუწერელი ioctl-ები გადაგზავნის ნაცვლად უარყოფილია; README-ში ამას „შეტევის ზედაპირის შემცირება“ ჰქვია და არა აპარატურული იზოლაცია. ურთიერთდაუჯერებელი მომხმარებლებისთვის VFIO ან vGPU კვლავ უფრო ძლიერ გადაწყვეტად რჩება.
იზოლირებული per-guest helper (isolate) ჯერ მხოლოდ დაპროექტებულია; CUDA შემოწმდა ჩამოთვლამდე; MIG და SR-IOV მოცულობაში არ შედის. მხარდაჭერილი დრაივერების სამი ABI პროფილია (535.129.03, 580.178.04 და 595.71.05), ძველი ვერსიები უარყოფილია. არქიტექტურა gVisor-ის nvproxy-სა და chromeos/virtio-media-ს მიჰყვება.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.