一、IOMMU简介
- IOMMU:input/output memory management unit。
- 连接DMA io bus和主存,完成从设备虚拟地址到物理地址的映射。
- 提供对故障设备的内存保护的功能。

优点
- 因为IOMMU的映射,能够将多个不连续的物理地址映射为大块连续的地址供设备使用,便于简化驱动设计
- 使旧设备(32bit设备)能够使用高位地址(能够改善内存使用,提高性能)
- 内存保护,避免设备使用不属于它的地址
- 提供硬件中断remapping功能
缺点
- 地址转换和管理开销带来的性能降级
- 消耗物理内存
虚拟化中的应用
一般来说,因为内存地址不同,虚拟机中的操作系统无法直接访问host上的设备。通过IOMMU,能够将设备地址在虚拟机中和host中映射为同样的支持,供虚拟机使用。这样的做法也能够缓解IO延时
iommu={off,force,noforce,soft}
通用IOMMU设置:参考文章:IOMMU - Linux 内核引导选项简介 - 开发文档 - 文江博客
off 彻底关闭IOMMU功能
force 强制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片组)或者根本没有必要这样做(例如内存不足3G)。
noforce(默认) 在内存不足3G的机器上,不使用硬件IOMMU,因为根本没有必要。
soft(Intel平台的默认值) 使用通过软件模拟的IOMMU(SWIOTLB),同时禁止使用硬件IOMMU(即使存在)。
二、Linux开启IOMMU
2.1 修改/etc/default/grub, 调整GRUB_CMDLINE_LINUX内容
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on iommu=pt"
#intel的cpu改为intel_iommu=on
#AMD的cpu改为amd_iommu=on

2.2 重新创建引导
如果服务器是UEFI启动,执行
centos系统
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
ubuntu系统
grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
如果服务器是 legacy模式启动
centos
grub2-mkconfig -o /boot/grub2/grub.cfg
ubuntu
grub-mkconfig -o /boot/grub/grub.cfg

2.3 在BIOS中开启IOMMU选项,如果网卡有对应的虚拟化选项需同步开启
2.4 查看状态
dmesg | grep -E "DMAR|IOMMU"
IOMMU启动状态

IOMMU 关闭状态

补充
iommu=pt并不会影响kvm/dpdk/spdk的性能,这三者本质上都是用户态驱动,iommu=pt只会影响内核驱动,能让内核驱动设备性能更高。
kvm一定要用intel_iommu=on,DPDK/SPDK如果绑定vfio-pci那也一定要求intel_iommu=on,如果绑定uio/igb_uio那么就不需要intel_iommu=on,推荐都用vfio-pci,后面kvm中的pci-assign,DPDK/SPDK用到的igb_uio都得淘汰。

6358

被折叠的 条评论
为什么被折叠?



