OpenStack PCI passthrough 环境配置

本文详细介绍了在OpenStack环境下配置PCI设备透传的技术细节,包括确认硬件支持、开启硬件辅助虚拟化功能、确认网络卡信息、解绑默认驱动、配置OpenStack启用透传、创建带有透传功能的flavor以及最终分配设备至虚拟机的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenStack PCI passthrough 环境配置

作者:张航东

OpenStack版本:Kilo


虚拟机使用透传设备可以获得设备近乎原生的性能。Intel AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为 Virtualization Technology for Directed I/O (VT-d),而 AMD 称之为 I/O Memory Management Unit (IOMMU)。不管是哪种情况,最新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。当这种映射发生时,硬件将负责访问(和保护),客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客 户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机(或管理程序)访问该内存。

 

1. 确认Host是否支持pci-passthrough

由于需要硬件支持,所以要预先确认cpu及主板是否支持IntelAMD的硬件辅助虚拟化功能,请查阅官方的硬件支持列表或者查看BIOS中的相关选项。

另外,所谓巧妇难为无米之炊,CPU支持只是pci-passthrough技术的必要条件,当然还

需要支持pci-passthrough的网卡。

以下以Intel E5-2690 + Intel X540 10G NIC + RHEL7.0为例。

 

2.查看Host是否开启硬件辅助虚拟化功能

[root@nova2 ~]# cat /proc/cmdline

BOOT_IMAGE=/vmlinuz-3.10.0-229.el7.x86_64

root=/dev/mapper/rhel-root

ro

rd.lvm.lv=rhel/root

crashkernel=auto

rd.lvm.lv=rhel/swap

vconsole.font=latarcyrheb-sun16

vconsole.keymap=us

rhgb

quiet

LANG=en_US.UTF-8

intel_iommu=on    #有这个字段说明Intel硬件辅助虚拟化功能已开启

default_hugepagesz=1G hugepagesz=1G hugepages=20

 

如果确认硬件支持硬件辅助虚拟化功能但没有开启,可以进行如配置:

[root@nova2 ~]# vi /boot/grub2/grub.cfg    #不同的OS或版本可能文件不同

#向其中的启动参数中添加以下

intel_iommu=on

然后reboot使配置生效

 

3. 确认NIC信息

[root@nova2 ~]# lspci -nn | grep Ethernet

01:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)

01:00.1 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)

82:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)

82:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)

84:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)

84:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)

 

此处以Intel X540 10G NIC为例:

1.84:00.1  pci bus address

2.[8086   vendor id

3.1528]   product id

(记住这三个信息,后面会用到)

 

4. 确认pci设备驱动信息并从host默认驱动程序中解绑,以备虚拟机透传使用

 

[root@nova2 ~]# virsh nodedev-list | grep pci | grep 84   #84是从上面的①来的

pci_0000_84_00_0

pci_0000_84_00_1

#因为这块网卡有两个物理port所以grep出来两条结果,下面我们只用pci_0000_84_00_1来演示

 

#然后确认pci_0000_84_00_1的相关信息

[root@nova2 ~]# virsh nodedev-dumpxml pci_0000_84_00_1

<device>

  <name>pci_0000_84_00_1</name>

  <path>/sys/devices/pci0000:80/0000:80:03.0/0000:84:00.1</path>

  <parent>pci_0000_80_03_0</parent>

  <driver>

    <name>ixgbe</name> #host默认驱动

  </driver>

  <capability type='pci'>

    <domain>0</domain>

    <bus>132</bus>

    <slot>0</slot>

    <function>1</function>

    <product id='0x1528'>Ethernet Controller 10-Gigabit X540-AT2</product>

    <vendor id='0x8086'>Intel Corporation</vendor>

    <iommuGroup number='34'>

      <address domain='0x0000' bus='0x84' slot='0x00' function='0x1'/>

    </iommuGroup>

  </capability>

</device>

 

#host的默认驱动ixgbe中解绑pci_0000_84_00_1

[root@nova2 ~]# virsh nodedev-detach pci_0000_84_00_1

Device pci_0000_84_00_1 detached

 

#再次确认解绑后的pci_0000_84_00_1信息

[root@nova2 ~]# virsh nodedev-dumpxml pci_0000_84_00_1

<device>

  <name>pci_0000_84_00_1</name>

  <path>/sys/devices/pci0000:80/0000:80:03.0/0000:84:00.1</path>

  <parent>pci_0000_80_03_0</parent>

  <driver>

    <name>vfio-pci</name> #驱动程序变为vfio(目前默认的虚拟化驱动)

  </driver>

  <capability type='pci'>

    <domain>0</domain>

    <bus>132</bus>

    <slot>0</slot>

    <function>1</function>

    <product id='0x1528'>Ethernet Controller 10-Gigabit X540-AT2</product>

    <vendor id='0x8086'>Intel Corporation</vendor>

    <iommuGroup number='34'>

      <address domain='0x0000' bus='0x84' slot='0x00' function='0x1'/>

    </iommuGroup>

  </capability>

</device>

 

5. 配置openstack,以启用pci-passthrough:

#Nova controller

[root@osc ~]# vi /etc/nova/nova.conf

#

# Options defined in nova.pci.pci_request

#

 

# An alias for a PCI passthrough device requirement. This

# allows users to specify the alias in the extra_spec for a

# flavor, without needing to repeat all the PCI property

# requirements. For example: pci_alias = { "name":

# "QuicAssist",   "product_id": "0443",   "vendor_id": "8086",

# "device_type": "ACCEL" } defines an alias for the Intel

# QuickAssist card. (multi valued) (multi valued)

#pci_alias=

pci_alias={ "name":"X540NIC", "slabel":"dpdk-int"}

       ①                                  

name字段,固定

name值,可以自己随便起

③不知道什么意思,好像也是自己起的

④不知道什么意思,好像也是自己起的

 

#Nova compute

[root@osc ~]# vi /etc/nova/nova.conf

#

# Options defined in nova.pci.pci_whitelist

#

 

# White list of PCI devices available to VMs. For example:

# pci_passthrough_whitelist =  [{"vendor_id": "8086",

# "product_id": "0443"}] (multi valued)

#pci_passthrough_whitelist=

pci_passthrough_whitelist={"vendor_id":"8086", "product_id":"1528", "slabel":"dpdk-int"}

               ⑤                                                          

vendor_id字段,固定

vendor_id的值,对应于表3中的②

product_id字段,固定

product_id的值,对应于表3中的③

⑨不知道什么意思,但要和controller的配置保持一致

⑩不知道什么意思,但要和controller的配置保持一致

 

改完重启OpenStack controller和compute服务。

 

6. 创建带有pci-passthrough的flavor

  在flavor中添加metadata,字段名为”pci_passthrough:alias”,值分为两部分,第一部分为别名,和表5中的②保持一致,第二部分为数量,根据实际情况填写即可。

 

7. 创建虚拟机,并确认pci-passthrough设备分配至虚拟机

<think>嗯,用户想了解如何在KVM虚拟机中配置网卡PCI设备并指定NUMA节点。这个问题涉及硬件虚拟化的高级配置,需要综合多个技术点来处理。 用户可能正在优化虚拟机性能,特别是网络密集型应用场景。从ta提问的精确性来看,应该具备一定的虚拟化基础,但可能对NUMA亲和性配置不熟悉。考虑到KVM的复杂性,需要分步骤解释清楚。 首先需要确认几个技术前提:主机必须支持IOMMU(Intel VT-d/AMD-Vi),这是PCI直通的基础条件。引用[3]提到过这点,用户可能已经开启但不确定。NUMA节点信息可以通过numactl命令查看,这是后续绑定的依据。 PCI设备直通部分要特别注意:网卡所属的NUMA节点必须与vCPU内存分配一致,否则跨节点访问会显著降低性能。引用[5]提到Nova通过libvirt管理这些配置,但用户当前是手动操作,所以需要直接修改libvirt XML。 在XML配置环节,最关键的是<numatune>和<cputune>标签的协同。比如把vCPU绑定到节点0时,内存模式必须设为strict,同时vfio-pci驱动的设备地址要准确。这里有个易错点:如果网卡本身不在绑定的NUMA节点上,即使配置了亲和性也无效。 性能验证部分建议用户用两套测试方案:iperf3测网络吞吐量时观察带宽波动,sysbench内存测试时注意延迟数据。曾经遇到过用户配置后性能反而下降的情况,最后发现是忘记配置巨页内存。 考虑到用户可能遇到的实际问题,在注意事项里强调了中断亲和性配置。很多网卡中断默认在随机核心处理,这会导致跨NUMA节点访问。ethtool结合irqbalance能解决这个问题,但容易被忽略。 最后补充了OpenStack环境下的差异点,因为引用[4][5]显示Nova对这些配置有封装。如果用户实际在生产环境使用,可能需要通过Flavor元数据来配置,这和手动操作很不同。 相关问题的设计覆盖了用户后续可能的需求:从NUMA检测工具到中断优化,再到动态迁移的限制。特别是SR-IOV场景的注意事项,用户如果使用高性能网卡必然会遇到。</think>在KVM虚拟机中为网卡PCI设备指定NUMA节点,需结合**PCI设备直通(Passthrough)** 和 **NUMA亲和性配置**,主要步骤如下: --- ### **1. 确认主机环境支持** - **启用IOMMU**:在主机BIOS中开启Intel VT-d或AMD-Vi(AMD-Vi),并确保内核启用IOMMU: ```bash # 编辑GRUB配置(例如:/etc/default/grub) GRUB_CMDLINE_LINUX="intel_iommu=on" # Intel # 或 GRUB_CMDLINE_LINUX="amd_iommu=on" # AMD ``` 更新后执行 `update-grub` 并重启主机。 - **确认NUMA拓扑**: ```bash numactl --hardware # 查看NUMA节点分布 ``` - **确认PCI设备位置**: ```bash lspci -nn | grep Ethernet # 获取网卡PCI地址(如:01:00.0) virsh nodedev-list --cap pci | grep 01_00_0 # 获取设备XML名称 ``` --- ### **2. 解绑网卡驱动并绑定VFIO** ```bash # 解绑原驱动 echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind # 绑定VFIO驱动 echo vfio-pci > /sys/bus/pci/devices/0000:01:00.0/driver_override echo 0000:01:00.0 > /sys/bus/pci/drivers_probe ``` --- ### **3. 配置虚拟机XML** 修改虚拟机XML(`virsh edit <VM_NAME>`): ```xml <domain type='kvm'> <!-- 1. 指定vCPU和内存的NUMA拓扑 --> <cpu mode='host-passthrough' check='none'> <numa> <cell id='0' cpus='0-3' memory='4194304' unit='KiB'/> <!-- 绑定到NUMA节点0 --> </numa> </cpu> <numatune> <memory mode='strict' nodeset='0'/> <!-- 内存严格分配在节点0 --> </numatune> <!-- 2. 添加PCI设备 --> <devices> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> <!-- PCI地址 --> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> <!-- 可选:指定虚拟设备NUMA节点 --> <numa> <node id='0'/> <!-- 设备关联到NUMA节点0 --> </numa> </hostdev> </devices> </domain> ``` --- ### **4. 启动虚拟机并验证** - **虚拟机内检查NUMA**: ```bash numactl -H # 确认vCPU和内存位于正确节点 lspci -vv # 确认直通网卡已识别 ``` - **性能测试**: ```bash # 跨NUMA节点测试网络延迟 numactl --cpunodebind=0 --membind=0 ping <目标IP> ``` --- ### **关键注意事项** 1. **NUMA节点一致性**: vCPU、内存、PCI设备应绑定到**同一NUMA节点**,避免跨节点访问延迟[^5]。 2. **中断亲和性**: 直通设备中断可能默认分配到随机核心,需手动绑定: ```bash # 查看中断号 grep eth0 /proc/interrupts # 绑定中断到NUMA节点0的CPU echo 0-3 > /proc/irq/<IRQ_NUM>/smp_affinity_list ``` 3. **SR-IOV场景**: 若使用SR-IOV(如网卡VF),需确保PF(物理功能)所在NUMA节点与VF分配一致[^1][^3]。 4. **热插拔限制**: 直通设备通常不支持热插拔,需在关机状态下配置[^5]。 --- ### **相关问题** 1. 如何检测KVM虚拟机是否因跨NUMA节点访问导致性能下降? 2. 使用SR-IOV网卡时,如何确保VF均匀分配到不同NUMA节点? 3. 在OpenStack中如何为实例配置NUMA亲和性和PCI直通设备?[^4][^5] 4. KVM虚拟机动态迁移(Live Migration)对NUMA绑定设备有何限制? [^1]: KVM 支持 PCI 设备直接分配和 SR-IOV,需启用 VT-d/IOMMU。 [^3]: 启用 Intel VT-d/AMD IOMMU 是 PCI 直通的必要条件。 [^4]: Nova 通过 libvirt 管理虚拟机设备添加。 [^5]: Libvirt 需支持 NUMA topology 才能绑定 vCPU 和内存到特定节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值