SR-IOV (Single Root Input/Output Virtualization) เป็นเทคโนโลยี Virtualization ของ Host Hardware Device ที่ช่วยให้ Virtual Machines เข้าถึง Host Devices โดยตรง สามารถ Virtualize Device Types ต่างๆ ได้ แต่ใช้บ่อยที่สุดสำหรับ Network Adapters บทความนี้แสดงวิธี Enable และ Configure SR-IOV สำหรับ Network Adapters ของ Virtual Machines บน Windows Hyper-V Server
SRV-IOV รองรับใน Hyper-V 2012+ รวมถึง Free Windows Hyper-V Server ไม่ได้ลงลึกในหลักการ SR-IOV เนื่องจากมี Guidelines เต็มๆ บนเว็บ สำหรับความเข้าใจทางปฏิบัติ พอรู้ว่า SR-IOV ให้ Direct Access ไปยัง Physical Network Adapters ของ Host สำหรับ VMs และ Bypass Traffic Processing โดย Hyper-V Virtual Switches Physical Network Adapter หนึ่งในโหมด SR-IOV สามารถให้บริการ Multiple VMs ได้
จากการใช้ SR-IOV สำหรับ Hyper-V VMs จะ เพิ่ม Throughput, ลด Network Latency และ CPU Load ที่เกิดจากการประมวลผล Network Traffic โดย Hyper-V Software
SR-IOV ไม่เข้ากันได้กับ NIC Teaming
เพื่อ Enable SRV-IOV บน Hyper-V Host ต้องมี Requirements ดังนี้
ขั้นแรก Enable SRV-IOV และ Virtualization Support ใน BIOS ของ Server ขึ้นกับ Vendor Settings อาจแตกต่างกัน
- Virtualization Support: Intel (Virtualization Technology, Intel VT, VT-d, Vanderpool), AMD (SVM, AMD-V)
- IOMMU
- SR-IOV
- ASPM

อาจไม่มีทุก Item แม้ไม่มี SR-IOV ก็ไม่ได้หมายความว่า Server ไม่รองรับ เช่น Supermicro Motherboards อาจไม่มี SR-IOV ใน BIOS แต่มี ASPM ปิดอยู่โดย Default หาก Enable ASPM และ Virtualization Support SR-IOV จะเปิดอัตโนมัติ
โปรดทราบว่า หาก Host Windows OS ติดตั้งด้วย SR-IOV ปิดใน BIOS Settings แล้วคุณ Enable มันทีหลัง System จะถือว่าคุณเปลี่ยน Network Adapter (Current Static IP Address จะ Reset)
ตรวจสอบว่า Hyper-V Server รองรับ SR-IOV ที่ระดับ Hardware หรือไม่ ด้วย PowerShell:
(get-vmhost).IovSupport
(get-vmhost).IovSupportReasons

หาก Server รองรับ Feature IovSupport จะเป็น True หากไม่ใช่ จะเป็น False ในกรณีนี้ Item IovSupportReasons จะแสดงเหตุผลว่าทำไม SR-IOV ไม่ได้รับการรองรับ เหตุผลปกติอธิบายรายละเอียด เหตุผลทั่วไป:
- Chipset บนระบบไม่ทำ Interrupt Remapping ซึ่ง SR-IOV ต้องการ
- Processor ไม่รองรับ Second-Level Address Translation (SLAT) สำหรับ Intel เรียกว่า Extended Page Tables (EPT) สำหรับ AMD เรียกว่า Rapid Virtualization Indexing (RVI) หรือ Nested Page Tables (NPT)
- PCI Express Hardware ไม่รองรับ Access Control Services (ACS) ที่ Root Port ใดๆ ติดต่อ System Vendor
- BIOS ต้อง Update เพราะมีข้อมูลผิดเกี่ยวกับ Hardware Capabilities ติดต่อ Manufacturer
- Chipset ไม่ทำ DMA Remapping ซึ่ง SR-IOV ต้องการ
- ระบบถูกตั้งค่า Disable I/O Remapping Hardware
- System BIOS ต้อง Update เพื่อให้ Windows ควบคุม PCI Express ติดต่อ Manufacturer
- ตรวจสอบว่า System มี Chipset Support SR-IOV และ I/O Virtualization เปิดใน BIOS
- ระบบรายงานว่าไม่มี PCI Express Bus ติดต่อ Manufacturer
Output เต็มของ get-vmswitch | fl *iov* มีข้อมูลที่มีประโยชน์ เช่น:
IovVirtualFunctionCount : 6 IovVirtualFunctionsInUse : 3
ตัวเลขแสดงจำนวน IOV Virtual Devices ที่มีอยู่และจำนวนที่ VMs ใช้
ตอนสร้าง Hyper-V Virtual Switch ติ๊ก Option SR-IOV Support — Enable single-root I/O virtualization (SR-IOV)

หรือ Enable EnableIOV Option ตอนสร้าง Virtual Switch ด้วย PowerShell:
New-VMSwitch -Name "VMNetExt" -NetAdapterName "Ethernet 2" -EnableIov 1
สำคัญ ไม่สามารถ Enable SR-IOV หลังสร้าง Virtual Switch ได้ หากไม่ทำตอนสร้าง ต้อง Delete VSwitch และสร้างใหม่
หาก Hyper-V Host รองรับ SR-IOV ไม่ได้หมายความว่าจะทำงานบน Virtual Switch เฉพาะ Switch ต้อง Bind กับ Network Adapter ที่รองรับ SR-IOV
มีอีกเรื่องสำคัญ Motherboard อาจมี Multiple Network Adapters แต่ SR-IOV อาจรองรับบนบางตัวเท่านั้น นอกจากนี้ หาก Adapter รองรับ SR-IOV ตาม Datasheet ไม่ได้หมายความว่าทำงานบน Motherboard ของคุณ
หลัง Enable SR-IOV บน Hyper-V และ Virtual Switch Levels ตรวจสอบด้วยคำสั่ง:
get-vmswitch | select IovSupport, IovSupportReasons, IovEnabled
Option IovEnabled แสดงว่า SR-IOV เปิดอยู่หรือไม่
แสดงรายการ Network Adapters ที่รองรับ SR-IOV ด้วย PowerShell:
Get-NetAdapterSriov | sort name | ft Name, InterfaceDescription, SriovSupport
หลัง Enable SR-IOV บน Hyper-V และ Virtual Switch Levels แล้ว สามารถ Enable บน Virtual Machines ได้ (ปิดอยู่โดย Default) หา Option Enable SR-IOV ใน Section Hardware Acceleration ของ Virtual Machine Network Adapter

หรือ Enable SR-IOV สำหรับ Network Adapter ของ VM ผ่าน PowerShell:
Set-VMNetworkAdapter -VMName mytestvm -VMNetworkAdapterName “Network Adapter” -IovWeight 100
ปิด SR-IOV เปลี่ยนค่า IovWeight เป็น 0
หา SR-IOV Errors และ Events ใน Hyper-V ได้จาก Event Viewer Log แยก:
Application and Services Logs → Microsoft → Windows → Hyper-V-SynthNic → Admin
หาก SR-IOV ทำงานถูกต้อง จะเห็น Entries ต่อไปนี้ใน Event Viewer ตอน VM Startup:
12597 Network adapter (%NIC_ID%) Connected to virtual network. 12582 Network adapter (%NIC_ID%) started successfully. 12584 Network adapter (%NIC_ID%) allocated a virtual function. 12588 Network adapter (%NIC_ID%) assigned a virtual function.
SR-IOV เพิ่มประสิทธิภาพ Network ของ Virtual Machines และ Hyper-V อาจเห็นผลสูงสุดบน Hyper-V Hosts ที่มี High Traffic ของ VMs ทำให้ Host CPUs โหลดหนัก