AMD-Vi: Event logged IO_PAGE_FAULT — Решение ошибок IOMMU AMD в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «AMD-Vi: Event logged [IO_PAGE_FAULT device=... domain=... address=... flags=...]» генерируется подсистемой ядра AMD-Vi (AMD I/O Virtualization Technology) на процессорах AMD EPYC, Threadripper и Ryzen. Ошибка указывает на то, что аппаратный контроллер IOMMU AMD зафиксировал попытку PCIe-устройства обратиться по адресу виртуальной памяти I/O (IOVA), для которого отсутствует валидная трансляция в таблице страниц IOMMU, либо нарушены права доступа (Read/Write/Execute).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| AMD-Vi | AMD IOMMU Architecture | Аппаратная технология виртуализации ввода-вывода и изоляции памяти процессоров AMD. |
| IO_PAGE_FAULT | Page Translation Miss | Устройство запросило чтение/запись по несмаппированному адресу памяти. |
| flags (PR / PW) | Protection Read/Write | Флаги указывают, было ли прервано чтение (PR) или запись (PW) данных. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Локализация виновника сбоя по BDF и анализ IOMMU групп
# Локализация устройства из строки ошибки (например, device=0000:21:00.0):
lspci -s 21:00.0 -v
# Проверка журнала ошибок AMD-Vi:
dmesg -T | grep -A 3 -B 3 "AMD-Vi: Event logged"Сценарий 2: Оптимизация параметров ядра amd_iommu в GRUB
Добавьте параметры принудительного сквозного режима и исправления ошибок страничной адресации IOMMU:
# Добавьте в /etc/default/grub:
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on amd_iommu_intr=vapic iommu.passthrough=1"
# Обновите конфигурацию GRUB:
sudo update-grub
sudo rebootСценарий 3: Обновление микрокода CPU (AGESA / microcode)
На процессорах AMD EPYC и Ryzen ошибки AMD-Vi часто вызваны багами ранних версий AGESA BIOS:
# Установка пакета микрокодов для процессоров AMD:
sudo apt-get install amd64-microcode || sudo dnf install microcode_ctl
# Проверка версии загруженного микрокода:
cat /proc/cpuinfo | grep -m 1 "microcode"ITSTM проводит аудит серверов на базе AMD EPYC/Ryzen, обновление прошивок BIOS/BMC и тонкую настройку подсистем SR-IOV/IOMMU.
Частые вопросы (FAQ)
Чем AMD-Vi отличается от Intel VT-d?
AMD-Vi и Intel VT-d — это реализации одной концепции IOMMU от разных производителей. AMD-Vi использует двухуровневую трансляцию адресов и таблицы Device Table с собственной структурой дескрипторов страниц IOVA.
Что означает флаг vapic в параметре amd_iommu_intr=vapic?
Опция vapic активирует виртуализацию контроллера прерываний Advanced Programmable Interrupt Controller (vAPIC) на процессорах AMD, что снижает нагрузку на гипервизор при маршрутизации прерываний IOMMU.
Почему IO_PAGE_FAULT сыплет тысячами сообщений в секунду?
Если контроллер сетевой карты или NVMe застрял в цикле DMA-передачи, он повторяет неудачные запросы непрерывно. Для подавления спама в dmesg временно используйте параметр amd_iommu_dump=0.
Может ли включение IOMMU снижать скорость работы быстрых NVMe накопителей?
Да, полная трансляция страниц IOMMU добавляет небольшую задержку (1-3%) на каждую операцию DMA. Использование режима iommu=pt полностью нивелирует эту просадку.