Troubleshooting#
This page provides guidance on troubleshooting common hipFile issues.
ais-check#
Use the ais-check utility provided by hipFile to verify that the system
meets the prerequisites for the fastpath. If any check fails, hipFile uses the
fallback path instead.
hipFile’s fastpath requires the following:
A Linux kernel with P2PDMA support enabled
ROCm 7.4 or later, including:
the HIP runtime
amdgpu
$ ais-check
AIS support in:
Kernel P2PDMA support : True
HIP runtime : True
amdgpu : True
For hipFile to use the fastpath, each reported requirement should be True.
If any check fails, resolve that issue first before investigating further.
Backing Storage#
hipFile’s fastpath is currently supported only when the target file or device uses one of the following storage configurations:
raw NVMe block device (without multipathing)
ext4 on an NVMe block device mounted with
data=orderedxfs on an NVMe block device
If the target file or device is backed by any other storage configuration, hipFile uses the fallback path.
Note
Setting HIPFILE_UNSUPPORTED_FILE_SYSTEMS=true bypasses the file system
check and allows the fastpath to attempt I/O on unsupported file systems.
This is not recommended for production use, as it may result in data
corruption or data loss.
NVMe multipath#
hipFile does not support NVMe multipath devices for fastpath I/O.
To disable NVMe multipath on Ubuntu 24.04:
sudo bash -c 'echo "options nvme_core multipath=N" > /etc/modprobe.d/nvme_core.conf'
sudo update-initramfs -c -k all
sudo systemctl reboot
Alignment and I/O size#
Each I/O request must satisfy alignment and size requirements of the underlying
file system and storage device to use hipFile’s fastpath. Clients can use
statx to determine file alignment (stx_dio_offset_align), I/O size
(stx_dio_offset_align), and memory alignment (stx_dio_mem_align)
requirements.
If an I/O request does not satisfy alignment and size requirements, hipFile will
use the fallback path. ais-stats can be used to determine if I/O requests
are using the fallback path.
I/O statistics#
Use ais-stats to display runtime hipFile I/O statistics. These stats help
determine whether requests are using the fastpath or fallback path.
Set HIPFILE_STATS_LEVEL to 1 (default) or 2 before running
ais-stats. For usage details and examples, see
hipFile ais-stats tool.
Performance baseline#
Use fio with the psync engine to establish a performance baseline for
hipFile. When using the same storage device and similar I/O settings (for
example block size, queue depth, and read/write pattern), hipFile should be
able to achieve similar performance to fio psync.
For example, to estimate the expected baseline on the file system mounted at
/mnt/storage, run:
$ fio \
--name=test \
--directory /mnt/storage \
--ioengine=psync \
--rw=randread \
--direct=1 \
--size=128M \
--bs=1M \
--time_based \
--ramp_time=5 \
--runtime=10 \
--numjobs=1 \
--group_reporting
PCIe Topology#
Use the lstopo command to inspect the link speeds and NUMA topology of the
system’s PCIe devices. On some systems, bandwidth between the GPU and storage
device may be limited by the PCIe topology.
Run the following command to display the system PCIe topology:
lstopo --filter core:none --filter group:none --no-caches --no-smt -.ascii
System Log#
Inspect the system log for any hipFile/AIS-related errors.
For example, the following log messages from amdgpu indicate that hipFile
I/O could not be mapped to a supported I/O device.
Jun 01 13:11:39 kernel: amdgpu: Invalid file path or mount point
Jun 01 13:11:39 kernel: amdgpu: Failed to read AIS file: -19
Disable the Fallback Path#
When hipFile is unable to use its fastpath, it routes I/O through the fallback path. When investigating performance issues, it can be useful to disable the fallback path. With fallback disabled, hipFile returns an error when an I/O request cannot be completed using the fastpath.
Disable the fallback path by adding HIPFILE_ALLOW_COMPAT_MODE=false to the
environment.
For example:
$ HIPFILE_ALLOW_COMPAT_MODE=false <command>
Poor performance within QEMU virtual machines#
Within a QEMU virtual machine, if hipFile I/O throughput is lower than expected, PCIe devices may be incorrectly attached to the virtual machine root bus. Ensure that each passthrough PCIe device (GPU, NVMe, …) is attached to its own root port. Devices attached directly to the root bus may be unable to fully utilize available PCIe bandwidth.
When PCIe devices are attached directly to the root bus, lspci -tv will
look similar to the following:
$ lspci -tv
-[0000:00]-+-00.0 Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller
+-01.0 Device 1234:1111
+-02.0 Red Hat, Inc. Virtio block device
+-03.0 Red Hat, Inc. Virtio network device
+-04.0 KIOXIA Corporation NVMe SSD Controller XG8
+-11.0 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX/7900M]
+-11.1 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 HDMI/DP Audio
+-11.2 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 USB
+-11.3 Advanced Micro Devices, Inc. [AMD/ATI] Device 7444
+-1f.0 Intel Corporation 82801IB (ICH9) LPC Interface Controller
+-1f.2 Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode]
\-1f.3 Intel Corporation 82801I (ICH9 Family) SMBus Controller
In this configuration, TransferBench CPU -> GPU and GPU -> CPU averages are typically much lower than bare-metal measurements:
$ TransferBench p2p
CPU->CPU CPU->GPU GPU->CPU GPU->GPU
Averages (During UniDir): N/A 5.48 7.17 N/A
When PCIe devices are attached to their own root ports, lspci -tv output
will be similar to the following:
$ lspci -tv
-[0000:00]-+-00.0 Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller
+-01.0 Device 1234:1111
+-02.0 Red Hat, Inc. Virtio block device
+-03.0 Red Hat, Inc. Virtio network device
+-04.0-[01]----00.0 KIOXIA Corporation NVMe SSD Controller XG8
+-05.0-[02]--+-00.0 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX/7900M]
| +-00.1 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 HDMI/DP Audio
| +-00.2 Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 USB
| \-00.3 Advanced Micro Devices, Inc. [AMD/ATI] Device 7444
+-1f.0 Intel Corporation 82801IB (ICH9) LPC Interface Controller
+-1f.2 Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode]
\-1f.3 Intel Corporation 82801I (ICH9 Family) SMBus Controller
In this configuration, TransferBench CPU -> GPU and GPU -> CPU averages are typically in line with bare-metal measurements:
$ TransferBench p2p
CPU->CPU CPU->GPU GPU->CPU GPU->GPU
Averages (During UniDir): N/A 21.24 28.00 N/A
Below is an example QEMU command where GPU and NVMe devices are attached to their own root ports:
./qemu-system-x86_64 \
-machine q35,accel=kvm,kernel_irqchip=on \
-cpu host,topoext=on,migratable=off \
-smp 32,sockets=1,dies=2,cores=8,threads=2 \
-m 96G \
-drive file=disk.qcow2,if=none,id=disk0,format=qcow2,cache=none,aio=io_uring,discard=unmap \
-device virtio-blk-pci,drive=disk0,id=virtio-disk0 \
-netdev user,id=net0 \
-device virtio-net-pci,netdev=net0,id=nic0 \
-device pcie-root-port,id=pcie.1,bus=pcie.0,chassis=1,slot=1 \
-device vfio-pci,bus=pcie.1,host=0000:01:00.0 \
-device pcie-root-port,id=pcie.2,bus=pcie.0,chassis=2,slot=2,multifunction=on \
-device vfio-pci,bus=pcie.2,host=0000:83:00.0,addr=0.0,multifunction=on \
-device vfio-pci,bus=pcie.2,host=0000:83:00.1,addr=0.1 \
-device vfio-pci,bus=pcie.2,host=0000:83:00.2,addr=0.2 \
-device vfio-pci,bus=pcie.2,host=0000:83:00.3,addr=0.3
From the QEMU command above, the NVMe device is passed through with:
-device pcie-root-port,id=pcie.1,bus=pcie.0,chassis=1,slot=1 \
-device vfio-pci,bus=pcie.1,host=0000:01:00.0 \
From the QEMU command above, the GPU device is passed through with:
-device pcie-root-port,id=pcie.2,bus=pcie.0,chassis=2,slot=2,multifunction=on \
-device vfio-pci,bus=pcie.2,host=0000:83:00.0,addr=0.0,multifunction=on \
-device vfio-pci,bus=pcie.2,host=0000:83:00.1,addr=0.1 \
-device vfio-pci,bus=pcie.2,host=0000:83:00.2,addr=0.2 \
-device vfio-pci,bus=pcie.2,host=0000:83:00.3,addr=0.3
See QEMU’s documentation for more information about PCIe passthrough.