一、IOMMU简介
- IOMMU:input/output memory management unit。
- 连接DMA io bus和主存,完成从设备虚拟地址到物理地址的映射。
- 提供对故障设备的内存保护的功能。
优点
- 因为IOMMU的映射,能够将多个不连续的物理地址映射为大块连续的地址供设备使用,便于简化驱动设计
- 使旧设备(32bit设备)能够使用高位地址
(能够改善内存使用,提高性能) - 内存保护,避免设备使用不属于它的地址
- 提供硬件中断remapping功能
缺点
- 地址转换和管理开销带来的性能降级
- 消耗物理内存
虚拟化中的应用
一般来说,因为内存地址不同,虚拟机中的操作系统无法直接访问host上的设备。通过IOMMU,能够将设备地址在虚拟机中和host中映射为同样的支持,供虚拟机使用。
这样的做法也能够缓解IO延时。
二、Linux开启IOMMU
2.1 修改/etc/default/grub, 调整GRUB_CMDLINE_LINUX内容
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on iommu=pt"
(amd_iommu/intel_iommu/AuthenticAMD)
2.2 重新创建引导
- 如果服务器时UEFI启动
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
- 普通模式启动
grub2-mkconfig -o /boot/grub2/grub.cfg
2.3 在BIOS中开启IOMMU选项,如果网卡有对应的虚拟化选项需同步开启
2.4 查看状态
dmesg | grep -E "DMAR|IOMMU"
参考:
https://loveyu.org/5685.html
https://www.jianshu.com/p/035287ba9acb
https://www.cnblogs.com/bhlsheji/p/5317002.html